C语言指针p,*p,**p以及&p在内存中的关系
C语言指针p,*p,**p以及&p在内存中的关系
#最小的访问单元“字节”
要了解数据存储在内存中的关系就要知道,数据在内存中怎么存储的。首先我们需要知道数据在内存里的存储方式,计算机里所有的数据是以二进制0、1形式进行位存储,在物理层面上的表现就是节点高低电位的变化,通俗点讲就是一个位节点的两个状态0或者1,2个位节点就能组成00,01,10,11四个状态,而人可以对每个状态进行定义,张三,李四,王二,麻子。在计算机中,8位就可以表示美国人常用的一个字符,因此1B(byte)=8b(bit),一字节等于八位就流传下来了,而一字节能存储的数据是2^8=256个状态。计算机能访问的最小单元就是一字节,能修改的最小单位是一位。
#内存地址”
为了快速方便的寻找到特定存储空间的数据,于是对每个字节空间进行地址编号,通过特定的寻址方式,找到对应空间的数据内容。可以简单的理解为一个字节空间由内存分配的地址和可修改的数据两部分组成。
#指针运算符”
指针运算符有两个,取内容(*)和取地址(&)。以下图为例。
程序:
int a=10;
int *p=&a;
printf(“a的地址为:&a=%x\n”,&a);
printf(“指针p的值为:p=%x\n”,p);
printf(“指针p的地址为:&p=%x\n”,&p);
printf(“p指向的值为:*p=%d\n”,*p);
结果:
a的地址为:&a=60fefc
指针p的值为:p=60fefc
指针p的地址为:&p=60fef8
p指向的值为:*p=10
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.
p表示指针变量自身存储空间的数据60fefc,&a表示的值同样也是60fefc,而&p的地址为60fef8。我们可以发现指针变量是一种专门存放地址的变量,而取内容符号*,则是提取的指向地址里对应的数据内容。
同理**p1也是一样的,与*p的区别在于,p的内容可以是任意格式字符,而p1的内容为地址。