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

时间:2018-02-28 15:33:05

标签: c

我在数组和指针上尝试了一个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

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

2 个答案:

答案 0 :(得分:5)

*&一起使对方无效。 &*(p+i)相当于(p+i)(p+i)给出数组的i th 元素的地址。要访问元素的值,您需要从该表达式中删除&,该*(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]));

并将其命名为

{{1}}

答案 1 :(得分:2)

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

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

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