分享

C语言 指针数组 数组指针

 心不留意外尘 2016-05-25

http://blog.csdn.net/edwzhang/article/details/7225421

2012

最近在看蔡明志的《指针的艺术》,觉得第三章中关于数组指针的描述有点问题(原书第35页,章节3-3)。原话就不再列出来了,免得又误导了自己。

 

在网上找了一下,基本都一致(和蔡明志书上的不一样哦):

指针数组,就是指针的数组,数组的元素是指针;如: int *p[10];    // 含有10个指向int值的指针。
数组指针,就是指向数组的指针。                            如: int (*p)[10];  // 这个指针指向含有10个int值的数组。

原因在于[]的优先级比*高。

 

再加个测试代码:

#include <stdio.h>

int main() {

 int i[][3] = {10, 20, 30, 40, 50, 60};
 int (*ptr)[3];
 int a, b, total = 0;

 for (a = 0; a < 2; a++)
  for (b = 0; b < 3; b++)
   printf("&i[%d][%d] = %x\n", a, b, &i[a][b]);

 printf("\n");
 for (a = 0; a < 2; a++)
  for (b = 0; b < 3; b++)
   printf("i[%d][%d] = %d\n", a, b, i[a][b]);

 ptr = i;
 printf("\n");
 printf(" ptr = %x\n *ptr = %x\n i[0] = %x\n i = %x\n *i = %x\n", ptr, *ptr, i[0], i, *i);

 for (a = 0; a < 2; a++)
  for (b = 0; b < 3; b++)
   total += *(*(ptr + a) + b);
 printf("Sum1 = %d\n", total);

 total = 0;
 for (a = 0; a < 2; a++)
  for (b = 0; b < 3; b++)
   total += *(ptr[a] + b);
 printf("Sum2 = %d\n", total);

 total = 0;
 for (a = 0; a < 2; a++)
  for (b = 0; b < 3; b++)
   total += ptr[a][b];
 printf("Sum3 = %d\n", total);

 return 0;
}

 

测试结果:

&i[0][0] = c6937bd0
&i[0][1] = c6937bd4
&i[0][2] = c6937bd8
&i[1][0] = c6937bdc
&i[1][1] = c6937be0
&i[1][2] = c6937be4

i[0][0] = 10
i[0][1] = 20
i[0][2] = 30
i[1][0] = 40
i[1][1] = 50
i[1][2] = 60

 ptr = c6937bd0
 *ptr = c6937bd0
 i[0] = c6937bd0
 i = c6937bd0
 *i = c6937bd0
Sum1 = 210
Sum2 = 210
Sum3 = 210

 

分析如下:

 for (a = 0; a < 2; a++)
  for (b = 0; b < 3; b++)
   total += *(*(ptr + a) + b);

两次外循环:第一次,将第一行的三个值相加;第二次,将第二行的三个值相加。

 

因为 *(ptr + a) = ptr[a],*(ptr[a] + b) = ptr[a][b],所以可以换成另外两种取值的方式:

total += *(ptr[a] + b);

total += ptr[a][b];

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多