指针的基础地址理解问题

第一个输出是为什么哦,纯为了理解


#include
int main()
{
    
    char a[] = {'a','b','\0'};
    printf("%c\n", a);//输出$
    printf("%s\n", a);//输出ab
    
    printf("%p", a);
    return 0;
}

“Devil组”引证GPT后的撰写:

  • 在这个程序中,a是一个字符数组,即字符串,其长度为2(不包括字符串结尾的空字符\0)。因此,在使用printf函数输出a时,会输出a数组的第一个元素,即字符'a'对应的ASCII码值。
  • 在这里使用了%c格式化字符输出,它表示输出一个字符。因此,printf("%c\n", a);输出的结果为字符'a'对应的ASCII码值。根据ASCII码表,字符'a'的ASCII码值为97,而字符'b'的ASCII码值为98。
  • 而在使用%s格式化字符串输出时,需要传入一个指向字符串的指针。因此,printf("%s\n", a);输出的是a数组中从第一个元素开始的字符串,即字符'a'和字符'b'组成的字符串。因为a数组以空字符\0结尾,所以printf函数会一直输出字符,直到遇到空字符为止。
  • 最后,printf("%p", a);输出的是a数组的地址,即a数组第一个元素的地址。在大多数系统中,地址的输出形式为十六进制数,因此输出的结果可能是类似于0x7fff5fbff89c这样的值。

第一个输出 %c 是以字符格式输出变量 a 的第一个元素,但是变量 a 是一个字符数组,只给出了数组的第一个元素,没有给出数组名或数组下标,因此编译器并不知道要输出哪个元素,于是随机返回了一个字符。$ 并不是公认的随机字符,输出结果可能因编译器和操作系统的不同而有所差异。

正确的输出方式应该是 printf("%c\n", a[0]);,指明要输出数组 a 的第一个元素。

以下是修正过的代码,可以正确输出:

#include<stdio.h>

int main()
{
    char a[] = {'a','b','\0'};
    printf("%c\n", a[0]); //输出a
    printf("%s\n", a); //输出ab
    printf("%p\n", a); //输出 a 的地址
    return 0;
}