C语言中使用指针打印一维数组问题求助
问题:用指针打印一维数组数据失败
我想通过指针打印数组数据,尝试把数组地址存到指针里,但指针没法正常打印数据。后续还要打印二维数组,所以声明了一些额外变量。以下是输出截图和相关代码:
输出截图

代码
// 打印一维和二维数组 #include<stdio.h> #include<stdlib.h> int Arr1[10]; int Arr2[10][10]; int i, j, n1, n2; int (*p1)[10]; int (*p2)[10][10]; int main() { printf("对于一维数组:\n"); printf("请输入要添加的元素个数:"); scanf("%d", &n1); printf("请输入元素数据:\n"); for(i=0;i<n1;i++) { scanf("%d", &Arr1[i]); } printf("显示数组:\n"); for(i=0;i<n1;i++) { printf("%d\t", Arr1[i]); } printf("\n用指针显示数组:\n"); p1=Arr1; printf("一维数组内容:\n"); for(i=0;i<n1;i++) { printf("Arr[%d] = %d\t", i, *(p1[i])); printf("\n第%d个元素的地址:%u\n", i, p1[i]); } }
问题原因与修复方案
核心问题是指针类型不匹配,导致指针运算和取值逻辑完全错误:
- 你声明的
p1是int (*p1)[10],这是一个指向包含10个int元素的数组的指针,而非指向单个int元素的指针。 - 把
Arr1赋值给p1时,数组名退化为指向首元素的指针,和p1的类型不匹配,后续p1[i]会按照“指向数组的指针”规则运算:每次跳过i*10*sizeof(int)字节,指向第i个“10元素数组”,完全偏离了访问一维数组元素的意图。
修复方式(二选一)
方式1:修改指针类型为指向单个int的指针
如果只是为了遍历一维数组,把p1的声明改成:
int *p1;
遍历代码调整为标准写法(注意打印地址要用%p而非%u):
printf("\n用指针显示数组:\n"); p1 = Arr1; printf("一维数组内容:\n"); for(i=0;i<n1;i++) { printf("Arr[%d] = %d\t", i, p1[i]); printf("\n第%d个元素的地址:%p\n", i, &p1[i]); }
方式2:保留原指针类型,调整赋值与取值逻辑
如果要保留int (*p1)[10]的类型(比如为后续二维数组操作统一风格),需调整如下:
- 赋值时让
p1指向整个一维数组:p1 = &Arr1; - 访问元素时先解引用指针得到数组,再用下标访问:
(*p1)[i]
修改后的遍历代码:
printf("\n用指针显示数组:\n"); p1 = &Arr1; // 指向整个一维数组 printf("一维数组内容:\n"); for(i=0;i<n1;i++) { printf("Arr[%d] = %d\t", i, (*p1)[i]); printf("\n第%d个元素的地址:%p\n", i, &(*p1)[i]); }
额外提示
- 打印地址必须用
%p格式化符,严格标准下需将地址显式转为void*类型,例如(void*)&(*p1)[i]。 - 全局变量尽量少用,建议把数组、循环变量等声明在
main函数内部,避免命名污染和意外初始化问题。
内容的提问来源于stack exchange,提问作者L127Bangtanned
相关产品推荐
相关产品推荐

