C语言-指针

什么叫指针
用来存放变量地址的变量,就称为指针变量
指针一个作用:能够根据一个地址值,访问(取值 | 赋值)对应的存储空间

指针的定义:类型标识符 *指针变量名
如:int *p;
 float *P;
 其中 * 是一个说明符,用来说明这个变量是个指针变量
 前面的类型标识符,表示指针变量所指向的变量的类型,而且只能指向这种类型的变量
 *p=10;这里的*表示通过访问p指向的地址对应的存储空间
 
 指针初始化

// 定义int类型的变量a
    int a = 20;
    
    // 定义一个指针变量p
    int *p;
    
    // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a
    p = &a;

 给指针指向的变量赋值/取值

 //给指针指向的变量赋值:
    char b=10;
    printf("修改前b的值%d\n",b);
    char *p2=&b;
    *p2=11;// 通过指针变量p间接修改变量a的值
    printf("修改前b的值%d\n",b);
    
    //取出指针所指向变量的值
    //*p2的意思是:根据p2值(即变量b的地址)访问对应的存储空间,并取出存储的内容(即取出变量a的值),赋值给value
    char value=*p2;
    printf("取出 b的值b=%d\n",value);


 注意

①. Int *p;

double d=10.0;

p=&d;//不建议此种做法

②.

指针变量是用来存放变量地址的,不要给他随意赋值一个常数,
 例如 int *p; p=200; 这是错误的

③.
在指针变量没有指向确定地址之前,不要对它所指的内容赋值,下面的写法错误:
 int *p;
 *p=10;//错误
 应该在指针变量指向一个确定的变量后再进行赋值。下面的写法才是正确的:
 int a=2,b;
 int *p;
 p=&b;
 *p=a;

④. Int *p=&a;但是不能写成 int *p;*p=&a;这种写法没有任何的意义,可以认为*是和类型符一起使用的。

⑤. *是指针运算符,访问指针指向的空间
 

用途:

用途1.互换两个实参的值

/**
 *  交换2个数
 */
void swap(char *v1, char *v2) {
    // 中间变量
    char temp;
    
    // 取出v1指向的变量的值
    temp = *v1;
    
    // 取出v2指向的变量的值,然后赋值给v1指向的变量
    *v1 = *v2;
    
    // 赋值给v2指向的变量
    *v2 = temp;
}

//用途1.互换两个实参的值
    char x=8;
    char y=11;
    printf("\n\n交换之前数据x=%d,y=%d\n",x,y);
    swap(&x, &y);
    printf("交换之后数据x=%d,y=%d\n",x,y);

用途2.实现函数有"多返回值"

要求:写一个函数sumAndMinus,可以同时计算2个整型的和与差,函数执行完毕后,返回和与差(注意了,这里要返回2个值)

// 计算2个整型的和与差
int sumAndMinus(int v1, int v2, int *minus) {
    // 计算差,并赋值给指针指向的变量
    *minus = v1 - v2;
    
    // 计算和,并返回和
    return v1 + v2;
}

//用途2.实现函数有"多返回值"
    int a=3, b=5;
    int c;
    int d=sumAndMinus(3,5, &c);
    
    printf("%d+%d=%d,%d+%d=%d",a,b,d,a,b,c);

练习代码:

#include <stdio.h>

/**
 *  使用指针改变一个值
 *
 *  @param a 指针变量a
 */
void change(int *a)
{
    *a=10;
}

/**
 *  交换2个数
 */
void swap(char *v1, char *v2) {
    // 中间变量
    char temp;
    
    // 取出v1指向的变量的值
    temp = *v1;
    
    // 取出v2指向的变量的值,然后赋值给v1指向的变量
    *v1 = *v2;
    
    // 赋值给v2指向的变量
    *v2 = temp;
}

// 计算2个整型的和与差
int sumAndMinus(int v1, int v2, int *minus) {
    // 计算差,并赋值给指针指向的变量
    *minus = v1 - v2;
    
    // 计算和,并返回和
    return v1 + v2;
}

int main(int argc, const char * argv[]) {
    
    
    int i=2;
    change(&i);
    printf("改变后的值i=%d\n",i);
    
    // 定义int类型的变量a
    int a = 20;
    
    // 定义一个指针变量p
    int *p;
    
    // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a
    p = &a;
    
    
    
    //这里,定义一个指针变量p1
    //并将变量a的地址赋值给指针变量p1,所以指针变量p1指向变量a
    int *p1=&a;
    
    
    //给指针指向的变量赋值:
    char b=10;
    printf("修改前b的值%d\n",b);
    char *p2=&b;
    *p2=11;// 通过指针变量p间接修改变量a的值
    printf("修改前b的值%d\n",b);
    
    //取出指针所指向变量的值
    //*p2的意思是:根据p2值(即变量b的地址)访问对应的存储空间,并取出存储的内容(即取出变量a的值),赋值给value
    char value=*p2;
    printf("取出 b的值b=%d\n",value);
    
    
    //用途1.互换两个实参的值
    char x=8;
    char y=11;
    printf("\n\n交换之前数据x=%d,y=%d\n",x,y);
    swap(&x, &y);
    printf("交换之后数据x=%d,y=%d\n",x,y);
    
    //用途2.实现函数有"多返回值"
    a=3;
    b=5;
    int c;
    int d=sumAndMinus(3,5, &c);
    
    printf("%d+%d=%d,%d+%d=%d",a,b,d,a,b,c);
    

    
    printf("\n\n");
    return 0;
}
View Code

 

 

 
 

posted on 2015-03-04 22:36  二狗你变了  阅读(202)  评论(0)    收藏  举报

导航