C 数组和指针的关系,为什么此代码不打印[i]
我在数组和指针上试过一个c程序C 数组和指针的关系,为什么此代码不打印[i],c,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)); } } 它打印地址
#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));
}
}
它打印地址而不是数组元素
&*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]
——这个术语只不过是数组的大小 *
和&
在这里一起抵消彼此的影响<代码>&*(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]);
}
}
叫它
fun(a, sizeof(a)/sizeof(a[0]));
卸下
和。不知道为什么要将i
传递给fun
但是…打印的是地址而不是值*p是值,&(*p)是地址提示:顺便说一句,fun
没有原型。它应该抛出一些警告&
和*
是相反的运算符<代码>&*p==p
和*&p==p
void fun(int *p, int size);
fun(a, sizeof(a)/sizeof(a[0]));