gpt4 book ai didi

c - 字符串文字和数组的地址

转载 作者:行者123 更新时间:2023-12-05 08:30:56 30 4
gpt4 key购买 nike

    int main(){
char *str1="Hi", *str2 = "Bye";
printf("%u,%u\n",&str1,str1);
int arr[5]={1,2,3,4,5};
printf("%u,%u",arr,&arr);
}

这里发生了什么? str&str 给出不同的地址,arr&arr 给出相同的地址。

我的理解是 arr 指向第一个元素的地址,即 &arr[0]&arr 也会给出相同的地址,但它是整个arr[5]的地址。如果我们将 &arr 递增 1,那么它将指向 arr[4] 的下一个元素。但问题是为什么这个过程在字符串的情况下是不同的。请帮我想象一下这里的概念。

最佳答案

在 C 中,所有字符串文字实际上都存储为(只读)字符数组,包括空终止符。与任何其他数组一样,它们会衰减到指向其第一个元素的指针。

对于您代码中的 str1,编译器生成了一些类似于以下的代码:

// Compiler-generated array for the string
char global_array_for_Hi[] = { 'H', 'i', '\0' };

int main(void)
{
char *str1 = global_array_for_Hi;
...
}

您的指针变量 str1 指向该数组的第一个元素('H')。当您打印 str1 的值时,这就是您获得的值。

当你打印 &str1 的值时,你会得到变量 str1 本身的位置,你会得到一个指向 str1 类型的指针char **.

从图形上看,它看起来像

+-------+     +------+     +-----+-----+------+| &str1 | --> | str1 | --> | 'H' | 'i' | '\0' |+-------+     +------+     +-----+-----+------+

对于 arr 你有一个数组,它衰减到指向它的第一个元素的指针。当您使用 arr 时,它与 &arr[0] 相同(它来自 arr[i] 完全等于 *(arr + i)). arr(和&arr[0])的类型是int *

当你使用 &arr 时,你会得到一个指向整个数组的指针,它的类型是 int (*)[5]

&arr[0]&arr的位置相同,但它们的类型有很大不同。


在相关说明中,printf格式说明符 %u 用于打印 unsigned int 类型的值。要打印指针(更具体地说是 void * 类型的值),您必须使用格式说明符 %p。格式说明符和参数类型不匹配会导致未定义的行为

关于c - 字符串文字和数组的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61185866/

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