一、sizeof 运算符sizeof 是运算符用于获取某个类型或变量在内存中占据的字节数。用法sizeof(int)sizeof(i)结果在编译期就已确定括号内的运算不会执行。二、取地址运算符 scanf(%d, i);中的作用获取变量的内存地址。操作数必须是变量不能对表达式、临时值取地址。不能取地址的情况(ab)(a)(a)地址输出格式printf(%p, i);地址大小与 int 是否相同取决于编译器与系统。三、指针基础1. 指针是什么指针就是保存地址的变量。普通变量存实际值指针变量存变量的地址。2. 指针定义c运行int i; int *p i; // p 是指针保存 i 的地址int* p, q;→ p 是指针q 是普通 intint *p, q;→ 含义同上写法更清晰3. 访问指针所指变量* 运算符*是单目运算符用来访问指针地址上的变量。可做右值可做左值。c运行int k *p; // 取出 p 指向的值给 k *p k 1; // 修改 p 指向的变量的值4. 指针作为函数参数函数可以通过指针访问、修改外部变量。c运行void f(int *p); int i 0; f(i); // 把 i 的地址传进去四、指针的典型应用场景场景 1函数返回多个值c运行void minmax(int a[], int len, int *min, int *max); int main(void) { int a[] {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55}; int min, max; minmax(a, sizeof(a)/sizeof(a[0]), min, max); printf(min%d, max%d\n, min, max); return 0; } void minmax(int a[], int len, int *min, int *max) { int i; *min *max a[0]; for(i1; ilen; i){ if(a[i] *min) *min a[i]; if(a[i] *max) *max a[i]; } }场景 2函数返回状态结果用指针带出c运行#include stdio.h // 返回1表示除法成功0表示失败 int divide(int a, int b, int *result); int main(void) { int a5, b2, c; if(divide(a,b,c)){ printf(%d\n, c); } return 0; } int divide(int a, int b, int *result) { if(b 0) return 0; *result a / b; return 1; }五、数组与指针的关系1. 函数里的数组参数本质是指针函数参数表中int a[]等价于int *asizeof(a)sizeof(int*)但依然可以用[]访问元素。2. 数组变量是特殊指针数组名本身代表首元素地址c运行int a[10]; int *p a; // 不用 a a[0][]可用于指针p[0]等价于a[0]*可用于数组*a 25等价于a[0] 25数组变量是 const 指针不能被赋值a NULL;错误等价int *const a ...六、指针与 const1. 判断规则const 在 * 前面指针指向的值不能改const 在 * 后面指针本身的地址不能改2. 三种写法c运行const int *p1 i; // 指向的值不能改 int const *p2 i; // 同上 int *const p3 i; // 指针本身不能改指向3. 指针是 constc运行int *const q i; *q 26; // OK q; // ERROR4. 所指是 constc运行const int *p i; *p 26; // ERROR i 26; // OK p j; // OK5. const 数组c运行const int a[] {1,2,3,4,5,6};数组每个单元都是const int只能初始化不能赋值。七、指针运算1. 指针 ± 整数指针 1 →指向下一个同类型变量不是简单地址 1。c运行int a[10]; int *p a; *(p1) a[1]2. 常用简写*p先取*p的值再把p指向下一个。效率极高常用于遍历数组。3. 指针比较, , , , , !都可使用。比较的是内存地址大小。4. 0 地址 / NULL0 地址通常不可访问用来表示无效指针。用NULL表示 0 地址更规范。八、指针类型所有指针大小相同都是地址。不同类型指针不能直接互相赋值。void*表示未知类型指针可接收任意类型地址。c运行int *p i; void *q (void*)p;九、动态内存分配 malloc /free1. mallocc运行#include stdlib.h void *malloc(size_t size);向系统申请连续字节的堆空间。返回void*需强转为需要的类型。示例(int*)malloc(n * sizeof(int))2. freec运行free(指针);把 malloc 申请的空间还给系统。必须传申请时返回的首地址。申请过的空间必须释放避免内存泄漏。3. 申请失败空间不足时返回NULL。十、指针核心总结取地址*访问指针指向的值。指针是保存地址的变量函数可用指针修改外部变量。数组参数本质是指针数组名是首地址。const 在 * 前限制值在 * 后限制指针本身。指针 1 是移动到下一个同类型变量。malloc 申请堆内存free 必须成对使用。