我在数组和指针上尝试了一个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
它打印地址而不是数组元素
答案 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
中的结果,此处x
为p+i
。 p
是指向数组第一个元素的指针,并向其添加i
,该值在sizeof *p
增加sizeof int
,在您的情况下为4个字节。更清楚的是,您在每次迭代中都打印了&p[i]
,而且格式说明符也是错误的。使用%p
格式说明符打印地址。
如果要打印数组 - 请删除运算符&
的地址,而是使用要打印的值*(p+i)
或p[i]
。
你已经通过i
虽然不清楚为什么。您已使用硬编码值来表示数组长度。要知道如果你打算传递数组的大小,你可以通过sizeof arr/sizeof arr[0]
- 这个术语只是数组的大小。