gpt4 book ai didi

c - 为什么 char* 在 C 中被视为与 char** 相同?

转载 作者:太空狗 更新时间:2023-10-29 14:59:40 26 4
gpt4 key购买 nike

我有以下测试应用程序:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(void){
char buf[512];
buf[0]= 0x1;
buf[1]= 0x2;
char *temp1 = &buf;
char *temp2 = buf;
char *temp3 = &buf[0];
printf("temp1:%p, temp2:%p, temp3:%p\n",temp1,temp2,temp3);
printf("0 = %d, %d, %d\n",temp1[0],temp2[0],temp3[0]);
printf("1 = %d, %d, %d\n",temp1[1],temp2[1],temp3[1]);
return;
}

编译时出现警告:

gcc ./testptr.c -o testptr
./testptr.c: In function ‘main’:
./testptr.c:9: warning: initialization from incompatible pointer type

但是当我运行它时,所有三个指针的行为都相同。

./testptr
temp1:0x7fff3a85f220, temp2:0x7fff3a85f220, temp3:0x7fff3a85f220
0 = 1, 1, 1
1 = 2, 2, 2

我知道 buf == &buf[0],但为什么 &buf == &buf[0]&buf 不应该是 char** 吗?

最佳答案

所有指针的行为都相同,因为您将它们全部声明为 char*。 C 是静态类型的,因此类型绑定(bind)到变量而不是值。

既然解释了行为部分,我们只需要找出为什么它们实际上具有相同的值(根据 %p printf)。好吧,这只是 GCC 将指针实现为内存地址的产物(使 * 不同于 ** 的偏移量和大小均由类型系统/编译器在幕后处理)。请注意,就像任何发出警告的最可疑的东西一样,这可能是未定义的行为,或者至少是一种不好的做法:)

关于c - 为什么 char* 在 C 中被视为与 char** 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7669861/

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