我已经尝试过关于数组和指针的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
它打印地址而不是数组元素
*
和&
在这里使对方的效果无效。 &*(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]));
&*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]
- 这个术语只是数组的大小。