了解C指针,递增和解引用

时间:2019-01-03 12:22:51

标签: c

我得到了一个程序,应该可以预测其输出。

我试图逐步了解程序,并在程序的每个点上写下变量的值,但是我不确定这些操作会做什么:

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

您能帮助我理解如何得出解决方案吗? 谢谢!

4 个答案:

答案 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。