C指针与数组学习(一)

前天看到一同事在研究指针,当下好奇,就过去看了一眼,用来测试的代码是这样子的

例子1

 int TestDatas[5] = { 0, 1, 2, 3, 4 };
 printf("%8p\r\n", &TestDatas);
 printf("%8p\r\n", &TestDatas + 1);
 printf("%8p\r\n", *(&TestDatas + 1));
 printf("%8p\r\n", *(&TestDatas + 1) - 1);
 printf("%d\r\n", *(*(&TestDatas + 1) - 1));

然后他问我,你知道每句输出是什么吗?我心中鄙视,当然知道了,其结果不言而喻,我错的很离谱,因当时在忙,只能暂记心中,直到现在才有功夫来搭理它。
这小段代码,其实是有问题的,先不管他是对是错,我们一行一行的来分析它。
printf("%8p\r\n", &TestDatas);
&TestDatas 这个表明是取TestDatas这个数组的地址的,没什么疑问,主要是看下面这两句

printf("%8p\r\n", &TestDatas + 1);
printf("%8p\r\n", *(&TestDatas + 1));

而我们出错就容易错在这两句话上,如果有些同学不小心,肯定以为这两句打印出来就是首地址+1sizeof(int),那这样就错了,请看下图

Paste_Image.png

为什么呢?为什么两个都是地址,并且地址都一样呢?打印出的第二行,我们的预期是首地址+1
sizeof(int),但是为什么不是呢?我们拆开来分析一下,TestDatas是地址吧,这个没有什么疑问吧,那&TestDatas就是数组地址的地址,也没有问题吧,而数组占用的存储空间是20个BYTE也没有问题吧,那么+1,就是加一个数组的大小的空间,这样就明白了,为什么首地址是0x0043FDB4 +1 后就是0x0043FDC8了。

 printf("%8p\r\n", *(&TestDatas + 1));

就更有迷惑性了,有些同学可能张口就说,这个打印出来的是1,那就大错特错了,这个地方需要重点注意,仔细点,再仔细点,不要轻敌,同样的,TestDatas 是地址,&TestDatas 是地址的地址,那数组地址+1,就是加整个数组,然后再取地址的地址,结果当然还是地址了。若是这样写

 printf("%8p\r\n", *(TestDatas + 1));

那结果铁定是1了。就是大部分人第一眼看到后心里想的结果了。

 printf("%8p\r\n", *(&TestDatas + 1) - 1);
 printf("%d\r\n", *(*(&TestDatas + 1) - 1));

这两个就是中规中矩的了,没什么好说的取到下一个数据空间的首地址,然后再减去一个1*sizeof(int) 另外一个就是对这个地址取值了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,509评论 3 44
  • 变量的声明和定义变量声明(declaration) 可以declaration很多次,不占内存空间,例如 exte...
    FlyingReganMian阅读 1,061评论 0 1
  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,854评论 0 9
  • 人间四月芳菲尽,山寺桃花始盛开。 长恨春归无觅处,不知转入此中来。 四月的天,总是阴晴不定。 四月的山,夭夭桃花,...
    何在在阅读 348评论 0 4
  • 2017-6-6 “你们当日所夸的福气在哪里呢?”(加4:15) 保罗:基督徒应该过福乐的生活。 如果我们不是如此...
    喜乐在我心阅读 159评论 1 2