最近刚学C语言程序设计,学到指针这一块时,觉得理解很吃力。可以麻烦大神能否详细给我说明一下指针吗?我知道指针也就是地址,但是在理解指针指向一维数组元素时,被弄得晕头转向。比如说,我定义 int a[10],*pa=a;
或int a[10],*pa=&a[10]; 时,a+i、pa+i、pa++ 分别表示什么意思?
您好,关于指针个人有一些心得,下的网址
http://blog.csdn.net/czmpersist/article/details/9288203
将指针讲得比较详细,一步一步深入,希望对您有帮助,有什么问题可以留言的!
指针是专用来存地址的变量;我定义 int a[10],*pa=a; pa就是一个指针,用来指向int类型变量,或称为保存int类型变量的地址; a是数组的起始地址;int pa=a;这样就可以用(pa++)来遍历数组了;
int a[10],*pa=&a[10];这是不对的, 数组下标从0开始,a[0]~a[9].
刚开始就是这样。建议将课本中的例子上机实验,再单步调试,观察。。。。
其实很简单的。。
指针的标准定义是一个变量的地址,这里我从另一个角度来理解,可能有问题,但我认为对理解指针有一定的帮助。
指针的作用是建立一个映射关系,将一个地址和地址上的东西联系起来,就好比一块地和那块地上的房子,而指针就是房产证;
比如
int* a = NULL;
当我这样申明的时候a是空白的,什么都没有,就如一张空白的房产证;
然后,
int b = 1;
a = &b;
这时我就建立了一个关系,a上面就记录了b的地址和b的值;
a就表示b的地址,如果要取到b的值就需要用*a这样的表达方式,就如房产证上写明了地址和这栋房住了谁(值),房产证上的地址是存储b的地址,住的就是b的值;
int a[10]又是什么意思呢?
其实这里就产生了10张空白的房产证,房产证上的地址分别是a+0,a+1,a+2,....,a+9这十张,
当我们这样做的时候:
a[0] = 1,相当于就是把房产证a上填上了值是1;
a[4] = 5, 相当于就是把房产证a+4上填上了值是5;
所以在这里a是一个指针,a[10]就是说我申请了10张连号的房产证,也就是10个连续的指针;
所以int* 就是一个最普通的指针,或者说一个指向一般值得指针,
那int**又是啥呢,是一个指向地址的指针,那么拿房产证又怎么说呢,
这时的房产证就比较特别了,首先它还是会记录一个地址,但就没有住的谁这个东西了,而是记录了另外一个地址,相当于这张证上同时记录了两个地址。如果非要拿实际打个比喻的话,可以理解成第一个地址记录了地皮的名字,第二个地址记录了房号,这样就可以找到你具体住哪里了;
继续上面的:
int b = 1;
a = &b;
int** c; //申明了一个指向地址的指针
c = &a; //c指向了a的地址,也就是指向了存储{[b的地址]的地址}
此时如果要用c取到b怎么办呢:
先取到a,也就是*c,
再取到b,也就是*(*c);
连起来就是**c,就等于b,也就是1
现在回到你提的问题:
1.int a[10],*pa=a 时,
这时pa应该是int**,因为它指向了int*;
a+i 指 a[i]的地址,
pa+i 在这里不确定是什么,是存储了a的地址的地址的第i块区域,是不确定的值
pa++ ,也就是pa = pa + 1,将pa的值加了1,此时pa指向了存储了a的地址的地址的下一块区域,也是不确定的值
2.int a[10],*pa=&a[10]时
pa是int*,是指向a[10]的指针,即pa == a + 10,在这里你应该是想说a[9]吧,要从0开始
a+i 同1指a[i]的地址
pa+i 是a[10 + i],是指向a+10+i这块地址放的值的指针,
pa++,pa = pa + 1,也就是吧pa自加1,pa此时指向了a+10这块地址的值
以上有些表述不够严密,有错误的地方还希望指出改正