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