C:字符串常量和数组的地址

问题描述 投票:0回答:1
    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 arrays string pointers
1个回答
0
投票

[首先,您为%ustr1都使用了错误的转换说明符&str1。对于str1,它应该是%s,对于&str1,它应该是%p

char *str1="Hi";
printf("%p,%s\n",&str1,str1);

str1是指向字符串literel "Hi"的第一个元素的地址的指针。 &str1是指针本身的地址。


0
投票

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

对于您代码中的str1,编译器已生成一些与此类似的代码:

char global_array_for_Hi[] = { 'H', 'i', '\0' };

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

您的指针变量str1指向此数组的第一个元素('H')。当您打印str1的值时,即得到的值。

[打印&str1的值时,会得到变量str1本身的位置,会得到指向str1类型的char **的指针。

© www.soinside.com 2019 - 2024. All rights reserved.