You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:25:21