"string" 我有点困惑。我知道的一-6ren">
gpt4 book ai didi

字符指针取什么的地址

转载 作者:太空狗 更新时间:2023-10-29 14:54:02 26 4
gpt4 key购买 nike

我读到:

char a[] = "string"; 

a: "string"

鉴于

char *ptr = "string" 

ptr: [__] ---> "string"

我有点困惑。我知道的一件事是指针总是存储地址。如果是字符指针,它存储什么地址?这个 block 代表什么(我指向字符串的 block )。是不是“字符串”的起始地址。

如果是数组呢?如何明确区分 char 指针和 char 数组?

最佳答案

图表可能会有所帮助。

char *ptr = "string";

+-------+ +----------------------------+
| ptr |--------->| s | t | r | i | n | g | \0 |
+-------+ +----------------------------+

char a[] = "string";

+----------------------------+
| s | t | r | i | n | g | \0 |
+----------------------------+

这里,ptr 是一个变量,它包含指向某些(常量)数据的指针。您随后可以通过为 ptr 分配一个新值来更改它指向的内存地址,例如 ptr = "alternative"; — 但您不能合法地更改包含 "string" 的数组(它是正式的只读或 const,尝试修改它可能会使您的程序崩溃,或者以其他方式意外破坏)。

相比之下,a 是用值"string" 初始化的7 个字节数据的第一个字节的常量地址。我没有显示地址的任何存储,因为与指针变量不同,没有一 block 可更改的存储来保存地址。您不能更改 a 指向的内存地址;它总是指向同一个空间。但是您可以更改数组的内容(例如,strcpy(a, "select");)。

当你调用一个函数时,差异就消失了:

if (strcmp(ptr, a) == 0)
…string is equal to string…

strcmp() 函数采用两个指向常量 char 数据的指针(因此它不会修改给它进行检查的内容),ptra 作为指针值传递。有充分的理由说只有指针被传递给函数——而不是数组——即使函数是使用数组表示法编写的。

然而,这很重要,数组(在参数列表之外)不是指针。断言的其他原因包括:

  • sizeof(a) == 7
  • sizeof(ptr) == 8(对于 64 位)或 sizeof(ptr) == 4(32 位)。

关于字符指针取什么的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com