gpt4 book ai didi

c - "Address of"(&) 一个被gcc忽略的数组/地址?

转载 作者:太空狗 更新时间:2023-10-29 16:34:56 25 4
gpt4 key购买 nike

我是一门编程入门课的助教,有同学犯过这样的错误:

char name[20];
scanf("%s",&name);

这并不奇怪,因为他们正在学习......令人惊讶的是,除了 gcc 警告之外,代码还有效(至少这部分)。我一直在努力理解并编写了以下代码:

void foo(int *v1, int *v2) {
if (v1 == v2)
printf("Both pointers are the same\n");
else
printf("They are not the same\n");
}

int main() {
int test[50];
foo(&test, test);
if (&test == test)
printf("Both pointers are the same\n");
else
printf("They are not the same\n");
}

编译和执行:

$ gcc test.c -g
test.c: In function ‘main’:
test.c:12: warning: passing argument 1 of ‘foo’ from incompatible pointer type
test.c:13: warning: comparison of distinct pointer types lacks a cast
$ ./a.out
Both pointers are the same
Both pointers are the same

谁能解释为什么它们没有什么不同?

我怀疑这是因为我无法获取数组的地址(因为我没有 & &x),但在这种情况下,代码不应编译。

编辑:我知道数组本身与第一个元素的地址相同,但我认为这与此问题无关。例如:

int main() {
int a[50];
int * p = a;
printf("%d %d %d\n", p == a, p == &a[0], &p[0] == a);
printf("%d %d %d\n", p == &a, &p == a, &p == &a);
}

打印:

$ ./a.out 
1 1 1
1 0 0

我不明白为什么第二行以1开头。

最佳答案

在您的示例中,数组 test 是一个包含 50 个 int 的 block 。所以它看起来像这样:

| int | int | ... | int |

当您将一元 & 运算符应用于数组时,您将获得数组的地址。就像你将它应用到其他任何东西上一样,真的。所以 &test 是一个指向 50 个 int block 的指针:

(&test) -----------> | int | int | ... | int |

指向 50 个整数数组的指针的类型为 int (*)[50] - 这就是 &test 的类型。

当你只是在任何地方使用名称 test 时,它不是 sizeof 或一元-& 运算符的操作数,它被评估为指向其第一个元素的指针。因此,您传递给 foo()test 评估为指向 test[0] 元素的指针:

(test) -----------------\
v
(&test) -----------> | int | int | ... | int |

你可以看到它们都指向同一个地址 - 虽然 &test 指向整个数组,而 test 指向数组的第一个元素(仅以这些值具有的不同类型出现)。

关于c - "Address of"(&) 一个被gcc忽略的数组/地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2893911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com