引子:
我们将内存比作宿舍楼,内存单元比作房间,地址比作房间号。 若在100个无房间编号中找人需要逐个查找,效率极低。 给房间编号后(如101、201),通过编号可快速定位。 而计算机中也是如此,原理与此相同 通过内存地址快速访问数据
我们可以打印出地址来一探究竟: 用%p来打印地址 用&取地址操作符来拿到地址
#include <stdio.h>
int main()
{
int a = 20;
printf("%p\n\n", &a);
//%p用于打印地址
//&a可拿到a的地址
return 0;
}运行结果: (我们这里使用x86环境,方便观察地址) (打印的地址是十六进制)

内存单元的编号=地址=指针 在C语言中,给地址起名-——指针
int * pa = &a;此处 ” pa “ 是一个变量,用来存放地址(指针),是指针变量 int * 是指针变量的类型 “ * ” 表示pa是指针变量,而int 表示pa指向的变量a类型是int
int a = 20;
int * pa = &a;
*pa = 200;
//通过地址找到a 并将a的值改为200** 指针变量在内存中占用的空间大小**
在32位操作系统中 地址是32个bit位,指针变量大小是4个字节 而在64位操作系统中 地址是64个bit位,指针变量大小是8个字节 ( 1字节 = 8bit位 ) 所以,指针变量的大小和类型是无关的,只要是在相同平台下,所有指针类型的变量大小都是相同的
但是: 指针类型决定了指针进行解引用时的访问权限大小
指针类型决定指针加减整数时的步进距离 ( +1 / -1 时走的距离)
int * 指针加 1 跳过 4 个字节 (如 p + 1 从 0xA8 变为 0xAC ) char * 指针加 1 跳过 1 个字节 (如 p + 1 从 0xA8 变为 0xA9 )
代码演示:
#include <stdio.h>
int main()
{
int a = 20;
int* pa1 = &a;
//int* 类型指针
char* pa2 = &a;
//char* 类型指针
printf("%p\n", &a);
printf("%p\n", pa1);
printf("%p\n", pa2);
printf("%p\n", &a + 1);
printf("%p\n", pa1 + 1);
printf("%p\n", pa2 + 1);
return 0;
}运行结果:

可以见得:
特别注意:
void * 指针不能计算!!! void * 是无具体类型的指针,可以用于接受任意类型地址 但是,void * 类型指针不能直接进行指针 + - 整数和解引用的运算 仅作为地址的临时存储容器 实际使用前需强制转换为具体类型指针
指针之间的运算就好比时间日期的运算,只能相减不能相加 指针相减得到两个指针之间的元素个数(绝对值) 结果可能为正或负,取决于指针地址高低关系
且注意: 两指针必须指向同一块连续内存空间(如数组) 不同类型指针相减无意义(如char减int)
代码演示:
#include <stdio.h>
int main()
{
int arr[20] = { 0 };
int* p1 = &arr[0];
//将arr[0]的地址赋给p1
int* p2 = &arr[19];
//将arr[19]地址付给p2
printf("%d\n\n", p1 - p2);
return 0;
}运行结果:

每个字节都有地址,地址本身具有大小关系 随着数组下标的增长,地址由低到高变化
所以,指针之间可以比较大小, 可以比较两个指针变量存储的地址值,或指针与数组边界地址的关系来比较大小
本期资料来自于:
OK,本期的指针详解到这里就结束了 由于文章过长,所以分了几篇文 若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持 本文有若有不足之处,希望各位兄弟们能给出宝贵的意见。谢谢大家!!! 新人,本期制作不易希望各位兄弟们能动动小手,三连走一走!!! 支持一下(三连必回QwQ)