【问题标题】:Issue with pointers using arrays in C在 C 中使用数组的指针问题
【发布时间】:2021-06-30 23:03:04
【问题描述】:

在 C 中使用指针和数组我发现了一个奇怪的案例,我不明白它为什么会发生。

首先,我要描述正确的情况: 我已经定义了一个函数void modifyArray(int *list),其中必须通过引用来修改数组以将项目乘以 2 倍 (x2)。函数实现为:

void modifyArray(int *list, int arrLength){
    for(int i=0; i<arrLength; i++){
        *(list + i) = *(list + i) * 2; // x = x * 2
    }
}

int main(int nargs, char **args) {

    int list[] = {1,2,3,4,5};
    modifyArray(&list, 5);

    for(int i=0; i<5; i++){
        printf("%d\n", *(list + i));

    }
}

输出是:

2
4
6
8
10

现在我要解释不正确的情况:我已经定义了一个新的数据类型List 并修改了函数以接受List 而不是int *int[]作为第一个参数:

typedef int List[5];

void modifyArray(List *list, int arrLength){
    for(int i=0; i<arrLength; i++){
        *(list + i) = *(list + i) * 2; // x = x * 2
    }
}

修改后我的编译器构建失败,因为句子 *(list + i) = *(list + i) * 2; // x = x * 2 can't multiply bacause of the following error message:

二进制表达式的无效操作数('List'(又名'int [5]')和'int')

我知道我的编译器试图将整个数组乘以 2,但不知道原因。

我找到的解决方案是将*(list + 1) 替换为*(*list + 1)。我很困惑,因为在第二种情况下,当我打印 list*list 时,输出是内存地址(两者的内存地址相同)而不是 list 的内存地址及其内容为 *list

您能否解释一下为什么会发生这种情况以及使用int *List 定义的类型有什么区别?

【问题讨论】:

  • @DavidC.Rankin: &amp;list 是一个指向数组的指针,而不是指向指针的指针,并按原样传递。
  • @EricPostpischil 我不明白为什么 &list 是一个指针。不就是内存地址吗?
  • @Marco:在谈到 C 时,“指针”和“地址”都用来表示地址,尽管“指针”可能专门用于指代指针类型的对象。
  • *(list + i)总是完全等同于list[i],只是后者更悦目,所以请选择后者。跨度>
  • 是的,int (*)[5] -- 我在做白日梦......

标签: arrays c pointers memory-address


【解决方案1】:

listint list[] = {1,2,3,4,5}; 定义时,&amp;list 是一个指向五个int 的数组的指针。将其传递给int * 类型的参数是不合适的,编译器应该在第一个代码中为此发出警告或错误。正确的论点是list。虽然这是一个数组,但它会自动转换为指向其第一个元素的指针,并且该指针是 int *,这是参数的正确类型。

当参数声明为List *list时,它是一个指向数组的指针。然后,在*(list + i) 中,以这些数组为单位进行加法,而不是int 的单位。加法的结果是一个指向数组的指针,所以*(list + i) 中的*的结果是一个数组。然后乘法是试图将一个数组乘以 2,所以编译器会报错。

改为将参数声明为List list。这声明它是一个数组,但它会自动调整为指向int 的指针。因为 C 不支持将数组作为参数传递,所以它会自动将参数声明为数组调整为指向数组元素的指针的声明,这是受支持的。

另外,不要写*(list + i)。使用list[i]。意思相同,但更容易阅读。

【讨论】:

    猜你喜欢
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2021-12-05
    • 2011-05-24
    • 2018-03-10
    相关资源
    最近更新 更多