char *p="Help"
printf("%ud",p);
我得到“Help”的基地址作为输出。这是否意味着字符串(“Help”)总是返回它的基地址。如果是这样,C++ 的情况是否相同。
你也能解释一下下面到底发生了什么。
char name[]="Hello";
我知道这很愚蠢,但我的大脑并不平静。
char *p="Help"
printf("%ud",p);
我得到“Help”的基地址作为输出。这是否意味着字符串(“Help”)总是返回它的基地址。如果是这样,C++ 的情况是否相同。
你也能解释一下下面到底发生了什么。
char name[]="Hello";
我知道这很愚蠢,但我的大脑并不平静。
在您在帖子中给出的第一个示例中,您正在使用一个指针,该指针指向存储字符的内存地址。这就是为什么当你打印 p 时你会得到一个地址。
在您的第二个示例中,您正在创建一个字符数组,每个字符都在“Hello”中存储一个字母。数组使用一些类似的内存访问原则,因为每个字符都存储在顺序内存位置中,因此 name[] 是一个内存位置,然后您访问的任何索引都是内存中第一个指针 name[] 所在的第一个元素所在的偏移量。
说,为简单起见,name[0] = 0x00,name[1] = 0x01,name[2] = 0x02 等等。现在,这些内存位置中的每一个都包含一个代表字符串“Hello”的一部分的值。访问时,通过您访问的索引知道 name[x] 在哪里,并且您可以根据访问元素的方式获得该内存位置或字符。
如果要打印字符串,请执行以下操作:
char *p="Help"
printf("%s",p);
线
char name[]="Hello";
声明name
为一个数组char
并将其初始化为包含文字(五个以, 或"Hello"
结尾的 ASCII 字符)。0
NULL
C 中的字符串是内存中的字符数组(以空字符结尾)。您示例中的变量p
是指向该内存地址的指针,这是您打印出来的。
第二个示例是相同的,除了您在堆栈上声明数组(与编译器的选择相反)。
主要区别在于,使用数组 ( []
) 表示法,您可以轻松计算数组(以及字符串)的大小,但使用指针表示法,您需要遍历数组以找到结尾来计算大小。
它在 C++ 中是相似的,但最好使用std::string
允许动态内存管理的类型(例如在连接字符串时)
当你使用它时%u
,printf
它总是打印任何变量的值。而且您正在使用字符串作为变量。在字符串中,第一个字符的地址和字符串的基地址相同。因此,它将始终显示字符串的基地址。例如,
char *p="Help";
printf("%u",p);
将始终显示基地址。
关于你的第二个问题,你必须知道隐式和显式初始化的概念。当您手动给出字符数组的大小时,它被称为显式初始化。例如char str[10]="abcdef"
;
而在其他情况下,如char str[]="abcd";
,它隐式地将字符串的长度作为字符数组的大小(在本例中为 4,从 0 到 3 开始,以空字符 '\0' 结束)。我希望你明白这一点。