前言
本章是指针部分的开始,将对C语言中非常重要的指针进行讲解。本章结束后有能力的读者可对应指针进阶部分进行进一步学习。指针专题配备了一些笔试题,建议尝试。
一、指针的定义
0x00 何为指针
❓ 我们先来看看定义:
指针是编程语言中的一个对象,利用地址,他的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
📚 简单地说:指针就是地址,地址就是指针;
📌 注意事项:
① 指针就是变量,用来存放地址的变量(存放在之阵中的值都被当成地址处理);
② 一个小的内存单元大小为 1 个字节;
③ 指针是用来存放地址的,地址是唯一标识一块内存空间的;
④ 指针的大小在 32 位平台上是 4 个字节,在 64 位平台上是 8 个字节;
💬 指针的创建:
int main() { int a = 10; // 在内存中开辟一块空间 int* pa = &a; // 使用解引用操作符&,取出变量a的地址 // 👆 将a的地址存放在pa变量中,此时pa就是一个指针变量 return 0; }
❓ 什么是指针变量
💡 指针变量就是存放指针的变量,这里的 int* pa 就是一个整型指针变量,里面存放了 a 的地址;
0x02 指针的大小
💻 32位平台:4 bit , 64位平台:8 bit ;
💬 验证当前系统的指针大小:
int main() { printf("%d\n", sizeof(char*)); printf("%d\n", sizeof(short*)); printf("%d\n", sizeof(int*)); printf("%d\n", sizeof(double*)); return 0; }
二、指针的指针类型
0x00 指针类型
📚 int 型指针和 char 型指针都可以存储 a ;
int main() { int a = 0x11223344; int* pa = &a; char* pc = &a; printf("%p\n", pa); printf("%p\n", pc); return 0; }
🚩 运行结果:他们的运行结果是一样的
0x01 指针类型的意义
📚 指针类型决定了指针进行解引用时,能够访问的内存大小是多少;
💬 不同的指针类型,访问的大小不同:
int main() { int a = 0x11223344; int* pa = &a; // 44 33 22 11 (至于为什么是倒着的,后面会讲。) *pa = 0;// 00 00 00 00 char* pc = &a; // 44 33 22 11 *pc = 0; // 00 33 22 11 // 在内存中仅仅改变了一个字节 // 解引用操作时就不一样了 // 整型指针操作了4个字节,让四个字节变为0 // 字符指针能把地址交到内存中, // 但是解引用操作时,只敢动1个字节 return 0; }
0x02 指针加减整数
📚 定理:指针类型决定指针步长(指针走一步走多远);
💬 代码验证:指针类型决定指针步长;
int main() { int a = 0x11223344; int* pa = &a; char* pc = &a; printf("%p\n", pa); // 0095FB58 printf("%p\n", pa+1); // 0095FB5C +4 printf("%p\n", pc); // 0095FB58 printf("%p\n", pc+1); // 0095FB59 +1 return 0; }
0x03 指针修改数组元素
💬 把数组里的元素都改成1
1. 使用整型指针:
int main() { int arr[10] = {0}; int* p = arr; //数组名 - 首元素地址 /* 修改 */ int i = 0; for(i=0; i<10; i++) { *(p+i) = 1; //成功,arr里的元素都变为了1 } /* 打印 */ for(i=0; i<10; i++) { printf("%d ", arr[i]); } return 0; }
🚩 1 1 1 1 1 1 1 1 1 1
2. 使用字符指针:
int main() { int arr[10] = {0}; char* p = arr; //数组名 - 首元素地址 /* 修改 */ int i = 0; for(i=0; i<10; i++) { *(p+i) = 1; // 一个一个字节改,只改了十个字节 } return 0; }
💡 解析:
🔺 总结:
① 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节);
② 譬如,char* 的指针解引用只能访问1个字节,而 int* 的指针解引用就能够访问4个字节




