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]的下一个元素。但是问题在于,为什么在字符串情况下此过程是不同的。请帮助我在这里形象化这个概念。
[首先,您为%u
和str1
都使用了错误的转换说明符&str1
。对于str1
,它应该是%s
,对于&str1
,它应该是%p
。
char *str1="Hi";
printf("%p,%s\n",&str1,str1);
str1
是指向字符串literel "Hi"
的第一个元素的地址的指针。 &str1
是指针本身的地址。
在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 **
的指针。