c语言指针概念解释_初步

 不要阅读本文,格式不好看,最重要的是知乎上有多个优秀的答案,结合着看更容易理解。本人只是作学习笔记,自己复习时,也会跳到知乎上看原答案。

 
 
作者:Wayne
链接:https://www.zhihu.com/question/24466000/answer/659429892
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
不理解指针,是因为有人教错了你。
有人告诉你,指针是“指向”某某某的,那就是误导你,给你挖了个坑。初学者小心不要误读这“指向”二字。

第一,“指针”通常用于保存一个地址,这个地址的数据类型在定义指针变量时确定。
举个例子,做个比较:
int a; //定义一个变量a,用于保存一个int类型。
int * b; //定义一个指针变量b,用于保存一个地址,这个地址所保存的数据应该是int类型。

第二,是变量就应该可以赋值,指针变量也一样。但一般不会给指针直接赋值一个数值,而是将其他变量的地址赋值给指针,或者其他指针的值赋值给这个指针。
继续上面的例子:
b=&a; //把变量a的地址赋值给b。“&”操作是取变量的地址。
继续举例:
int * c; //我们又定义一个指针c
c=b; //将b的值赋值给c,上面已经知道b是指针,它的值是a的地址,那么现在c 的值和b一样,也是个a的地址。

第三,指针变量保存的值,也就是地址是可以变的。
举个数组初始化的例子:
int d[100];
int * e;
e=&d[0]; //e保存了数组d的第一个数据的地址
for (int i=0; i<100; i++){
  *e = 0; //把该地址中的数据赋值0
  e++; //地址累加一次,也就是数组中下一个数据的地址
}
指针和其他变量一样,可以运算(一般是加减),也可以重新赋值。
注:大概只有内存连续的情况,才可以对对地址加减吧。

第四,指针有啥用。
比方说,我们有个函数,如下:
int add(int x){
  return (x+1); //把输入的值加1并返回结果。
}
好了,应用的时候是这样的:
{
  int a=1;
  a=add(a); //add函数返回的是a+1
  //现在 a等于2
}
很简单吧,就是把a都累加一次。
用指针怎么写:
void add(int *y){ //给入的是一个int指针,是一个地址。
  *y = *y + 1; //* 是指引用 这个地址所保存的变量
  //这条语句的意思就是,把这个地址里的值加1,然后放回这个地址(硬件层次)。
}
把这个函数用起来:
{
  int a=1;
  add(&a); //把a的地址传到函数里
  //add函数,就是把a的值加1,再放回到变量a里。
  //现在a等于2
}
试想一下,如果我们要对一个数据结构里的数据进行处理,那是不是就该传入这个结构的地址,在函数中依靠指针来引用这个地址的数据结构,进行运算。

第五,若已有一个指针变量,可不可以用另外一个指针来保存这个变量的地址呢。
可以的。
一个变量保存另一个指针的地址,那它就是通常所说是“指针的指针”了。
通常,指针的指针多用做(或指的是)函数指针或数据结构中有指针的情况。初学者搞不清,就不要勉强了。

第六,空指针可怕吗?
我们知道,一个变量要赋值后才能用,指针也是一样。指针不赋值(不给定地址)就拿来用,是不是也要出错。这个就是空指针。一般把指针赋值为Null,就是表明这个指针是空的,不能用。所以程序中一定要经常判别指针不是Null才能用。

最后,初学C语言,最好把复合的语句拆开来看,比较容易理解。像 int *a=&b; 这种,拆成
int * a;//定义一个int类型的指针变量a
a=&b;
就好理解了。
 
上面所说的,是指针比较基础的东西,希望能帮助初学者学习理清思路。
 

 ===================

注,指针变量定义最好加上后缀让人一看名字就知道这是个指针变量,如:

    char *cPtr; // pointer to a character
    int *iPtr; // pointer to an integer
    float *fPtr; // pointer to float
    double *dPtr; // pointer to a double
    
    char *c_name_ptr;
    int *i_age_ptr;
    float *f_score_ptr;
    double *d_num_ptr;

c,i,f,d表示了指针类型,Ptr后缀表明是个指针变量。

注:示例后四行是自己看资料,想的写法最好看专业资料有选择的吸收;

原文地址:https://www.cnblogs.com/Tpf386/p/13830554.html