理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实就是向内存申请空间,比如:
- #include
- int main()
- {
- int a = 10;
- return 0; }
⽐如,上述的代码就是创建了整型变量a,内存中申请4个字节,⽤于存放整数10,其中每个字节都有地址,上图中4个字节的地址分别是:
- 0x006FFD70
- 0x006FFD71
- 0x006FFD72
- 0x006FFD73
那我们如何能得到a的地址呢?这⾥就得学习⼀个操作符(&)-取地址操作符
- #include <stdio.h>
- int main()
- {
- int a = 10;
- &a;//取出a的地址
- printf("%p\n", &a);
- return 0;
- }
- #include
- int main()
- {
- int a = 10;
- int* pa = &a;//取出a的地址并存储到指针变量pa中
-
- return 0;
- }
我们看到pa的类型是 int* ,我们该如何理解指针的类型呢?
- int a = 10;
- int * pa = &a;
那如果有⼀个char类型的变量ch,ch的地址,要放在什么类型的指针变量中呢?
- char ch = 'w';
- pc = &ch;//pc 的类型怎么写呢?
- #include
- int main()
- {
- int a = 100;
- int* pa = &a;
- *pa = 0;
- return 0; }
同理64位机器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的⼤⼩就是8个字节。
- #include <stdio.h>
- //指针变量的⼤⼩取决于地址的⼤⼩
- //32位平台下地址是32个bit位(即4个字节)
- //64位平台下地址是64个bit位(即8个字节)
- int main()
- {
- printf("%zd\n", sizeof(char *));
- printf("%zd\n", sizeof(short *));
- printf("%zd\n", sizeof(int *));
- printf("%zd\n", sizeof(double *));
- return 0; }