黑马程序员技术交流社区
标题:
不是很明白指针数组是不是相当于一个特殊的二级指针。
[打印本页]
作者:
runsunlife
时间:
2015-8-18 11:10
标题:
不是很明白指针数组是不是相当于一个特殊的二级指针。
我已经被这几个数搞晕为嘛啊
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
//打印的是指针数组的第一个元素得值
printf(" &a = %p\n",&a);
printf(" pa[0] = %p\n",pa[0]);
//打印指针数组的首地址
printf(" pa = %p\n",pa);
printf(" &pa[0]= %p\n",&pa[0]);
//访问a的值 a = 3
printf(" *(&a) = %d\n",*(&a));
printf(" *(pa[0]) = %d\n",*(pa[0]));
//使用数组名来访问 a的值
//*pa == pa[0] (a的地址)
//**pa
printf("%d\n",**pa);
&a = 0x7fff5fbff7bc
pa[0] = 0x7fff5fbff7bc
pa = 0x7fff5fbff7f0
&pa[0]= 0x7fff5fbff7f0
*(&a) = 3
*(pa[0]) = 3
作者:
tangbinbin
时间:
2015-8-18 20:25
理解数组指针和指针数组的定义,指针数组定义一个指针变量的集合,就是数组里面存放的都是指针变量!(数组里面元素都是指针变量)
数组指针是定义了一个指向数组内各元素地址的一个指针变量。(指向数组内各元素的指针变量)
作者:
李天昊
时间:
2015-8-18 21:35
本帖最后由 李天昊 于 2015-8-18 21:38 编辑
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
这件事其实从另一个方向:数组定义形式 来说也许更好理解。
例子:int a[5]; char str[50]; float b[10]; 以上分别声明了整型数组,字符数组和浮点型数组。
而int *是什么,是指向整数的指针,指针是什么,还不就是数据在内存中的门牌号,归根结底也是个整数。
那么 int *pa[3]={&a,&b,&c}; 就是告诉编译器:诶!这是一个存了三个整数的数组,把每个整数的值当成地址,都能在内存中找到一个整数。
想到这层就很好理解了:
&a 是数组中第一个数,数组中第一个数能怎么表示? 是不是可以用pa[0]表示,那么很自然pa[0]就是&a是一个值;
数组名代表了什么? 数组名中存储了数组中第一个元素的地址,那么又是很自然 pa与&pa[0]是一个值;
*运算符实际上是怎么个原理?就是把他后边那个变量代表的整数当作地址,在内存里找数据,&a代表整型变量a的地址值,*(&a)就是根据这个地址值把变量取出来,同理*(pa[0])是一个道理;
**pa的话,一层一层分析,*pa就是把以pa的值作为地址的数据取出来,也就是数组第一个元素&a,那么**pa就是*&a,也就是变量a里面存的值 ,就是3.
实际上pa是一个指向数组第一个元素的指针,而数组第一个元素是一个指向整型变量的指针,也就是说数组名pa是一个指向整型变量的指针的指针,可以理解为二级指针。不过不管是几级指针都能够逐层剖析,他们归根结底还不就是存了一个整数,只不过这个整数像宾馆门牌号一样,是有特殊意义的,我们可以拿着指针上面写的门牌号找到对应的房间,又能在房间里找到另一个门牌号,于是我们又能找到第二个房间,逐层类推下去,不管几层的指针都能迎刃而解。
作者:
runsunlife
时间:
2015-8-19 16:11
谢谢哈。试着去努力理解
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2