声明的含义

发布于 2024-11-18 02:26:22 字数 192 浏览 4 评论 0原文

我多次遇到过 char* ch = "hello"; 语句。

我知道 char* ch 告诉 ch 是指向 char 的指针。但是将 hello 分配给 ch 意味着什么?

我无法理解这一点?请帮忙。

I have many times come across the statement char* ch = "hello";.

I understand that char* ch tells that ch is a pointer towards a char. But what does assigning hello to ch mean ?

I cannot undestand this ? please help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

人事已非 2024-11-25 02:26:22

这意味着 ch 是一个指向字符的指针。当您执行 char* ch = "hello" 时,ch 将指向第一个字符,即字符 h。要指向第二个字符,可以执行 ch + 1ch[1]。请注意,理想情况下,ch 的类型应为 const char*,因为您无法写入指向的内存位置。

It means ch is a pointer to a character. When you do char* ch = "hello" ch will be pointing to the first character i.e. character h. To point to the second character, you can do ch + 1 or ch[1]. Note that ideally the type of ch should have been const char* as you can not write to the pointed memory location.

梦里兽 2024-11-25 02:26:22

字符串文字静态存储在程序二进制文件内的某个位置。它们很可能被加载到内存中的只读“数据”部分,但这是未定义的行为。

分配字符串文字只需传递第一个字节的地址;在本例中,char* ch 指向“hello”中的“h”。

注意:修改静态字符串是未定义的行为!虽然您可以获得指针,但任何赋值都是危险的。

String literals are stored statically somewhere inside the program binary. They are most likely loaded into a readonly 'data' section in memory, but this is undefined behavior.

Assigning a string literal simply passes the address of the first byte; in this case, char* ch points to the 'h' in "hello".

Note: Modifying static strings is undefined behavior! While you can get a pointer, any assignment is dangerous.

流年里的时光 2024-11-25 02:26:22

这里发生了几件事。

"hello" 等于 { 'h', 'e', 'l', 'l', 'o', '\0' }。即,它是一个字符数组。数组可以隐式转换为相应的指针类型。因此,这里的语句实际上创建了一个(静态)字符数组,并将指向第一个元素的指针分配给变量 ch (顺便说一句,命名不好)。

There are several things happening here.

"hello" is equal to { 'h', 'e', 'l', 'l', 'o', '\0' }. I.e., it is an array of characters. Arrays can be implicitly converted to the corresponding pointer type. So the statement here really creates a (static) array of characters, and assigns the pointer to the first element to the variable ch (bad naming, by the way).

送你一个梦 2024-11-25 02:26:22

该语句编译为:

080483b4 <main>:
 80483b4:   55                      push   %ebp
 80483b5:   89 e5                   mov    %esp,%ebp
 80483b7:   83 ec 10                sub    $0x10,%esp
 80483ba:   c7 45 fc 94 84 04 08    movl   $0x8048494,-0x4(%ebp)
 80483c1:   c9                      leave  
 80483c2:   c3                      ret

0x8048494 处的字符串是“hello\0”,如 xxd 所示:

0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b  ....hello......;

the statement compiles to:

080483b4 <main>:
 80483b4:   55                      push   %ebp
 80483b5:   89 e5                   mov    %esp,%ebp
 80483b7:   83 ec 10                sub    $0x10,%esp
 80483ba:   c7 45 fc 94 84 04 08    movl   $0x8048494,-0x4(%ebp)
 80483c1:   c9                      leave  
 80483c2:   c3                      ret

the string at 0x8048494 is "hello\0" as seen here from xxd:

0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b  ....hello......;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文