了解C中的内存地址和指针

时间:2017-02-15 23:12:15

标签: c pointers memory-address

我收到了关于我的一个练习问题的以下问题:确定此代码所打印的内容:

#include <stdio.h>
int main(){
    int ids[3] = {100,200,300};
    int *salary, salary1, salary2, *salary3;
    salary1 = ids[0] * ids[1];
    salary = &ids[1] ;
    salary2 = *(ids+1)* *(ids+2);
    salary3 = ids+2;
    printf("*salary = %d\nsalary1 = %d\n", *salary, salary1);
    printf("salary2 = %d\nsalary3 = %p\n", salary2, salary3);
}

我对这段代码感到有点困惑。首先,在第4行:

    int *salary, salary1, salary2, *salary3;

如果在行的开头已使用星号,为什么在salary3的开头有星号?

其次说:

    salary1 = ids[0] * ids[1];

当我们不知道salary1的价值时,我们应如何确定ids[1]的价值?

2 个答案:

答案 0 :(得分:2)

  

如果在行的开头已经使用过星号,为什么在salary3的开头有一个星号?

星号表示下一个变量是指针。它与:

相同
int *salary;
int salary1;
int salary2;
int *salary3;

但在一条线上。

  

当我们不知道ids [1]的价值时,我们应如何确定薪水1的价值?

但你确实知道ids的价值[1]。它是200。

答案 1 :(得分:1)

首先,C声明语法有点令人困惑

int *x, y;

表示x是指向int的指针,y是int。这就是混乱的根源,几乎每个风格指南都禁止它。

  int ids[3] = {100,200,300};

声明一个数组。 ids [0] = 100,ids [1] = 200,ids [2] = 300.当数组较小时,只能通过眼睛匹配下标数组内容。所以这不是数组的正常使用。要么在全局内存中有大型只读表,要么在运行时创建一个数组并填充它。然而,不应该有一个问题是ids [1]持有200,这就是C数组语法的工作方式。