我得到了一个程序,应该可以预测其输出。
我试图逐步了解程序,并在程序的每个点上写下变量的值,但是我不确定这些操作会做什么:
increment(&i);
increment(&a[i]);
#include<stdio.h>
void increment(int *ptr){
++ *ptr;
}
int main(){
int a[]={5,10},i=0;
increment(a);
increment(&i);
increment(&a[i]);
increment(a+i);
printf("\nResult:i=%d\n",i);
printf("a[0]=%d\n a[1]= %d\n", a[0], a[1]);
return 0 ;
}
解决方案是:
Result: i = 1
a[0] = 6
a[1] = 12
您能帮助我理解如何得出解决方案吗? 谢谢!
答案 0 :(得分:0)
但我不确定这些操作会做什么:
increment(&i);
将i
变量的地址传递给您的增量函数。该函数取消对指针的引用,并增加指向的值,该值实际上等效于i++
。
increment(&a[i])
的作用相同,但是现在它传递了a
的第 i 个元素的地址。由于i
之前已增加到1
,所以它等效于a[1]++
。
答案 1 :(得分:0)
函数increment(int *ptr)
需要指向int
的指针,即地址。
由于变量i
的类型为int
,因此您必须使用 address-of 运算符&
来传递其地址,如下所示:{{1 }}
increment(&i)
等于a[i]
-即,您访问*(a+i)
处的数组元素的地址并对其取消引用,以获取位置{{1 }}。
与第一种情况相同,a+i
需要一个指针,因此您必须传递一个地址,如:i
答案 2 :(得分:0)
好的,这是嵌入式注释中的逐步说明。希望能帮助到你。您可能需要水平滚动以阅读全文。
#include<stdio.h>
// This function takes a pointer to int and increments the pointed value
void increment(int *ptr){++ *ptr;}
int main(){
int a[]={5,10},i=0; // It doesn't look so but here, a is a pointer to int
increment(a); // increments the first value pointed by a (a[0]) so now a is [6,10]
increment(&i); // increments i, now i = 1
increment(&a[i]); // increments a[1], now a = [6,11]
increment(a+i); // since i = 1, increments the value right after the one pointed by a so again, a[1], now a = [6,12]
printf("\nResult:i=%d\n",i);
printf("a[0]=%d\n" "a[1]= %d\n");
return 0 ;
}
答案 3 :(得分:0)
让我们从一些背景信息开始。
首先,表达式++i
的计算结果为i
的当前值加1-作为副作用,存储在i
中的值将递增。作为一个独立的表达式,它大致等效于i = i + 1
。
第二,除了它是sizeof
或一元&
运算符的操作数外,它是类型为“ T
的N元素数组”的表达式 (T [N]
)将被转换(“ decay”)为类型为“ pointer to T
”(T *
)的表达式,该表达式的值将是第一个的地址数组的元素。
最后,表达式a[i]
被定义为*(a + i)
-给定起始地址a
,偏移量i
元素(不是字节!),然后取消引用结果。这意味着表达式a + i
与表达式&a[i]
等效。
让我们看看这对您的代码如何适用:
在increment
函数中,该行
++ *ptr;
为ptr
指向的东西加1。
调用increment(a)
时,表达式 a
的类型为“ int
的2元素数组”。由于a
不是sizeof
或一元&
运算符的操作数,因此此表达式“衰减”以键入“指向int
的指针”(int *
),表达式的值是a
的第一个元素的地址。 IOW,就和您写过increment(&a[0])
一样。因此,在increment
函数中,以下是正确的:
ptr == &a[0]
*ptr == a[0]
因此,表达式++ *ptr
与表达式++ a[0]
等效。通话后,a[0]
现在是6。
当您致电increment(&i)
时,ptr
现在指向i
:
ptr == &i
*ptr == i
所以++ *ptr
等效于表达式++ i
,因此您要向i
加1。
调用increment(a[i])
时,i
等于1,因此等效于调用increment(a[1])
。通话之后,a[1]
等于11。
最后,increment(a+i)
等效于increment(&a[i])
,等效于increment(&a[1])
,并且在此调用之后a[1]
等于12。