目录
简单地说,指针是一个变量,它存储了另一个变量的地址。在计算机内存中,每个变量都有一个唯一的地址,指针存储了这个地址,从而可以直接访问该变量所在的内存位置。指针的引入使得 C 语言具有了更灵活的内存管理能力。
一、指针变量与地址
1、取地址操作符(&)
上述代码首先创建了一个变量a,并赋值为10。同时在内存上申请4个字节的空间,存放10。其中每个字节都有地址,上图中4个字节的地址分别是:(十六进制表示)
若要得到 a 的地址,就可以通过取地址操作符--&,注意 &a 取出的是a所占4个字节中地址较小的字节的地址。虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,就可以访问到4个字节的数据。
#include <stdio.h>
int main()
{
int a = 10;
&a; //取出a的地址
printf("%p\n", &a);
return 0;
}
2、指针变量和解引用操作符(*)
2.1、指针变量
通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x006FFD70,这个数值有时候也是需要存储起来,方便后期再使用的,那我们把这样的地址值存放在指针变量中。指针变量也是⼀种变量,这种变量就是用来存放地址的,存放在指针变量中的值都会理解为地址。注意:指针---地址,指针变量---存放地址,口头语所说的指针一般是指针变量。
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;//取出a的地址并存储到指针变量pa中
return 0;
}
2.2、如何拆解指针类型
关于地址要注意:
当输入代码 int a=10;时,由于是int类型,向内存申请四个字节空间,且每个字节都有自己的地址,假设地址分别为0x10、0x11、0x12、0x13,当&a(取地址a)时,其实是取出第一个字节的地址0x10,当要通过指针变量pa将其存起来时,pa里存放的其实是第一个字节的地址0x10。
int main()
{
int a = 10;
int* p = &a;
printf("%p", p);
return 0;
}
以该代码为例,首先查看&a(地址a)的内存, 可以发现首字节地址为0x007DFB30,继续运行后指针变量p所存储的正是a的首字节地址。
2.3、解引用操作符
我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?在现实⽣活中,我们使⽤地址要找到⼀个房间,在房间⾥可以拿去或者存放物品。
C语言中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,就需要⼀个操作符叫解引用操作符(*)。
下面代码中第7行就使用了解引用操作符, *pa 的意思就是通过 pa 中存放的地址,找到指向的空间,*pa其实就是 a 变量了;所以*pa=0,这个操作符是把a改成了0。
#include <stdio.h>
int main()
{
int a = 100;
int* pa = &a;
*pa = 0; //*是解引用操作符
return 0;
}
3、指针变量的大小
#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;
}
跳转其他页面: