A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我已经被这几个数搞晕为嘛啊
    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

3 个回复

倒序浏览
理解数组指针和指针数组的定义,指针数组定义一个指针变量的集合,就是数组里面存放的都是指针变量!(数组里面元素都是指针变量)
数组指针是定义了一个指向数组内各元素地址的一个指针变量。(指向数组内各元素的指针变量)
回复 使用道具 举报
本帖最后由 李天昊 于 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是一个指向整型变量的指针的指针,可以理解为二级指针。不过不管是几级指针都能够逐层剖析,他们归根结底还不就是存了一个整数,只不过这个整数像宾馆门牌号一样,是有特殊意义的,我们可以拿着指针上面写的门牌号找到对应的房间,又能在房间里找到另一个门牌号,于是我们又能找到第二个房间,逐层类推下去,不管几层的指针都能迎刃而解。
回复 使用道具 举报
谢谢哈。试着去努力理解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马