【问题标题】:Understanding memory addresses and pointers in C理解 C 中的内存地址和指针
【发布时间】:2017-02-15 23:12:15
【问题描述】:

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

#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];

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

【问题讨论】:

  • * 仅适用于紧随其后的变量,而不适用于该行的所有变量。
  • 因为不是int* salary等,而是int *salary等。*限定了变量,而不是类型。

标签: c pointers memory-address


【解决方案1】:

如果行首已经使用了星号,为什么薪水 3 的开头还有星号?

星号表示下一个变量是一个指针。同理:

int *salary;
int salary1;
int salary2;
int *salary3;

但在一条线上。

如果不知道ids[1]的值,我们应该如何确定salary1的值?

但您确实知道 ids[1] 的值。是 200。

【讨论】:

  • 我知道 ids[0] 的值是 2000,但不知道 ids[1]
  • @ShoaibAhmed 不,ids[0] 是 100。查看数组 int ids[3] = {100,200,300};,它将 ids[0] 定义为 100,ids[1] 定义为 200,ids[2] 定义为 300。
  • 哦,我的错,我想念那部分。感谢您指出这一点。
【解决方案2】:

首先,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 数组语法的工作原理。

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多