指针和数组的关系——C语言代码示例

📅 2026/7/2 11:09:40
指针和数组的关系——C语言代码示例
核心结论数组名单独使用时等价于指向首元素的指针arr[0]arr[i]等价于*(arr i)下标本质是指针偏移 解引用数组名是常量地址不能自增arr指针变量可以p。示例 1基础等价关系 arr [i] ↔ *(arri)#include stdio.h int main(void) { int arr[5] {10, 20, 30, 40, 50}; int *p arr; // 数组名arr arr[0]赋值给指针 printf(arr首元素地址 arr %p\n, arr); printf(首元素地址 arr[0] %p\n, arr[0]); printf(指针p存储的地址 p %p\n\n, p); // 四种写法完全等价 printf(arr[2] %d\n, arr[2]); printf(*(arr 2) %d\n, *(arr 2)); printf(p[2] %d\n, p[2]); printf(*(p 2) %d\n, *(p 2)); return 0; }输出原理arr 2跳过 2 个 int 长度指向第 3 个元素*取出内容。示例 2指针遍历数组指针可以自增数组名不行#include stdio.h int main(void) { int arr[4] {1, 3, 5, 7}; int *p arr; int len sizeof(arr) / sizeof(arr[0]); printf(指针遍历数组\n); for (int i 0; i len; i) { printf(%d , *p); p; // 指针向后移动一个int } // 错误arr是常量指针不能修改 // arr; return 0; }区别p是变量可p / p--arr是数组首地址常量arr编译报错。示例 3sizeof 区分数组和指针#include stdio.h int main(void) { int arr[5] {1,2,3,4,5}; int *p arr; // arr是完整数组总字节 5*420 printf(sizeof(arr) %zu\n, sizeof(arr)); // p只是指针变量64位系统固定占8字节 printf(sizeof(p) %zu\n, sizeof(p)); // 计算数组长度只能用数组名不能用指针 int len1 sizeof(arr) / sizeof(arr[0]); // 下面无意义只会得到 8/42不是数组真实长度 int len2 sizeof(p) / sizeof(p[0]); printf(数组真实长度 len1 %d\n, len1); printf(错误长度 len2 %d\n, len2); return 0; }示例 4数组作函数参数会退化为指针函数接收数组形参本质是指针函数内无法用 sizeof 求长度#include stdio.h // 三种写法完全等价形参都是int*指针 void printArr(int arr[], int len); void printArr(int arr[100], int len); void printArr(int *arr, int len); void printArr(int *arr, int len) { // 这里sizeof(arr) 指针大小8不是数组总长 printf(函数内sizeof(arr) %zu\n, sizeof(arr)); for (int i 0; i len; i) { printf(%d , arr[i]); } } int main(void) { int nums[3] {100, 200, 300}; int len sizeof(nums) / sizeof(nums[0]); printArr(nums, len); // 数组名传入自动转为nums[0] return 0; }示例 5二维数组与指针#include stdio.h int main(void) { int arr[2][3] { {1,2,3}, {4,5,6} }; // arr 指向第一行数组arr[0]指向第一行第一个元素 printf(arr %p\n, arr); printf(arr[0] %p\n, arr[0]); printf(arr[0][0] %p\n\n, arr[0][0]); // arr[1][2] 等价 *(*(arr 1) 2) printf(arr[1][2] %d\n, arr[1][2]); printf(*(*(arr 1) 2) %d\n, *(*(arr 1) 2)); return 0; }总结数组名 数组[0]仅在单独表达式中成立下标a[i] *(ai)数组和指针访问语法互通数组名是地址常量不可自增指针变量可自由偏移数组作为函数参数会隐式转换成指针丢失长度信息sizeof(数组)得到整个数组字节数sizeof(指针)只得到地址宽度。