0

可能重复:
C 中的 char s[] 和 char *s 有什么区别?

char *p="Help"
printf("%ud",p);

我得到“Help”的基地址作为输出。这是否意味着字符串(“Help”)总是返回它的基地址。如果是这样,C++ 的情况是否相同。

你也能解释一下下面到底发生了什么。

char name[]="Hello";

我知道这很愚蠢,但我的大脑并不平静。

4

4 回答 4

1

在您在帖子中给出的第一个示例中,您正在使用一个指针,该指针指向存储字符的内存地址。这就是为什么当你打印 p 时你会得到一个地址。

在您的第二个示例中,您正在创建一个字符数组,每个字符都在“Hello”中存储一个字母。数组使用一些类似的内存访问原则,因为每个字符都存储在顺序内存位置中,因此 name[] 是一个内存位置,然后您访问的任何索引都是内存中第一个指针 name[] 所在的第一个元素所在的偏移量。

说,为简单起见,name[0] = 0x00,name[1] = 0x01,name[2] = 0x02 等等。现在,这些内存位置中的每一个都包含一个代表字符串“Hello”的一部分的值。访问时,通过您访问的索引知道 name[x] 在哪里,并且您可以根据访问元素的方式获得该内存位置或字符。

于 2012-06-08T13:11:51.453 回答
0

如果要打印字符串,请执行以下操作:

char *p="Help"
printf("%s",p);

线

char name[]="Hello";

声明name为一个数组char并将其初始化为包含文字(五个以, 或"Hello"结尾的 ASCII 字符)。0NULL

于 2012-06-08T13:03:40.043 回答
0

C 中的字符串是内存中的字符数组(以空字符结尾)。您示例中的变量p是指向该内存地址的指针,这是您打印出来的。

第二个示例是相同的,除了您在堆栈上声明数组(与编译器的选择相反)。

主要区别在于,使用数组 ( []) 表示法,您可以轻松计算数组(以及字符串)的大小,但使用指针表示法,您需要遍历数组以找到结尾来计算大小。

它在 C++ 中是相似的,但最好使用std::string允许动态内存管理的类型(例如在连接字符串时)

于 2012-06-08T13:04:34.330 回答
0

当你使用它时%uprintf它总是打印任何变量的值。而且您正在使用字符串作为变量。在字符串中,第一个字符的地址和字符串的基地址相同。因此,它将始终显示字符串的基地址。例如,

char *p="Help";
printf("%u",p);

将始终显示基地址。

关于你的第二个问题,你必须知道隐式和显式初始化的概念。当您手动给出字符数组的大小时,它被称为显式初始化。例如char str[10]="abcdef"

而在其他情况下,如char str[]="abcd";,它隐式地将字符串的长度作为字符数组的大小(在本例中为 4,从 0 到 3 开始,以空字符 '\0' 结束)。我希望你明白这一点。

于 2012-06-08T13:24:45.100 回答