Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组和指针的关系,为什么此代码不打印[i]_C - Fatal编程技术网

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

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)); } } 它打印地址

我在数组和指针上试过一个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));
    }
}

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

&*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]));