数组和指针的关系,为什么这段代码不打印[i]

问题描述 投票:0回答:2

我已经尝试过关于数组和指针的c程序

#include<stdio.h>

int main()
{
    int a[10], i;
    for(i=0; i<10; i++)
    {
        a[i]=0;
    }
    fun(a,i);
}

fun(int *p, int i)
{
    for (i=0; i<10; i++)
    {
        printf("%d\n", &*(p+i));
    }
}

输出是:

2752228
2752232
2752236
2752240
2752244
2752248
2752252
2752256
2752260
2752264

它打印地址而不是数组元素

c
2个回答
5
投票

*&在这里使对方的效果无效。 &*(p+i)相当于(p+i)(p+i)给出了数组中ith元素的地址。要访问元素的值,您需要从该表达式中删除&,该表达式将为*(p+i),相当于p[i]


注意:不是使用循环来初始化数组的所有元素,而是可以使用初始化列表,如下所示

int a[10] = {0}; 

您还必须将数组的大小传递给函数。您的函数应该使用该大小来了解传递的数组的长度。

fun(int *p, int size){
    for (int i=0; i < size; i++){
        printf("%d\n", p[i]);
    }
}

不要忘记在main之前添加函数原型

void fun(int *p, int size);

并称之为

fun(a, sizeof(a)/sizeof(a[0]));

2
投票

&*x并排应用x的结果,这里xp+ip是指向数组的第一个元素的指针,并将i添加到它,该值在此处增加sizeof *p sizeof int,在您的情况下为4个字节。更清楚的是,你在每次迭代中都打印了&p[i],而且格式说明符也是错误的。使用%p格式说明符打印地址。

如果要打印数组 - 删除运算符&的地址,而是使用要打印*(p+i)p[i]的值。

你已经通过i虽然不清楚为什么。您已使用硬编码值来表示数组长度。知道如果你打算传递数组的大小你可以通过sizeof arr/sizeof arr[0] - 这个术语只是数组的大小。

© www.soinside.com 2019 - 2024. All rights reserved.