写程序关于c语言语法的一些心得--内存和指针的正确认识

本文章的内容是:内存和指针的终极认识!

 

  我们先来看这么一个题目:

 =================================================== 

  x86平台下,分析以下代码的输出结果:

  #include <stdio.h>

  int main(void)

  {

    int a[4] = {1, 2, 3, 4};

    int *p1=(int *)(&a+1);   //p1指向数组的下一个单元的首地址.

      int *p2=(int *)((int)a+1);  //

    printf("%x, %x\n", p1[-1], *p2);  

  }

    请问结果是什么呢? ------------请不要直接看下面的答案,

   先花五分钟想想 &a 是什么意思 、(int)a 又是什么意思?

.

.

.

.

.

.

.

.

.

.

.

. 你

.

.

.决

.

.

.定

.

.

.看

.

.

.下

.

.

.面

.

.

.的

.

.

.答案了?

.

.

.

.

.

  好吧,来到这里的人肯定不简单的  <`0_0`>...

  现在我来解释刚才提到的来个问题:

1.&a是什么>>>>>>>>>>&a 取整个数组的地址,作用目标是整个数组!  4*4个字节(32位操作系统)

2.(int)a是什么>>>>>>>>> 将a强制转换为整形进行运算

 

  先说第一个结果: 4

&a后加一就偏移了4*4个字节,然后就强制转换成(int *)类型(因为在那个位置里我们并没有定义它!所以需要强制转换)

p[-1]   等价于 *(p - 1) 又因为p是int *类型的(作用目标是4个字节),所以p[-1]向后偏移4个字节.

所以p[-1]的位置: a + 4*4 - 4;(相当于向后偏移了3个元素) 也就是第四个元素的首地址

 

  第二个结果呢?------这里插一句: 对于第一个结果的分析可以看到是用了内存和指针的关系,这也是为了下面做铺垫

a的首地址为0;由于小端模式(不知道就自行百度吧...).

因为取四个字节的数据,所以取出的结果是01000000 00000000 00000000 ......0(二进制总共32位),

又由于十六进制打印所以打印结果是 20000000(4字节的十六进制为八位).

 

posted @ 2017-03-01 19:16  得了白学症  阅读(417)  评论(0编辑  收藏  举报