gpt4 book ai didi

c++ - 如何理解 char * ch ="123"?

转载 作者:IT老高 更新时间:2023-10-28 21:54:07 25 4
gpt4 key购买 nike

我应该如何理解char * ch="123"

'1' 是一个 char,所以我可以使用:

char x = '1';
char *pt = &x;

但是我如何理解 char *pt="123"?为什么char *pt可以指向字符串?

pt 的值是 "123" 的第一个地址值吗?如果是这样,我如何获得 pt 指向的字符串的长度?

最佳答案

这实际上是一个非常好的问题,它是 C 语言中几个奇怪的结果:

1:指向字符的指针(char*)当然也可以指向字符数组中的特定字符。这就是指针算法所依赖的:

// create an array of three chars
char arr[3] = { 'a', 'b', 'c'};
// point to the first char in the array
char* ptr = &arr[0]
// point to the third char in the array
char* ptr = &arr[2]

2:字符串文字("foo")实际上不是 string 本身,而只是一个字符数组,后跟一个空字节。 (所以 "foo" 实际上等价于数组 {'f', 'o', 'o', '\0'} )

3:在 C 中,数组“衰减”为指向第一个元素的指针。 (这就是为什么很多人错误地说“C 中的数组和指针没有区别”)。也就是说,当您尝试将数组分配给指针对象时,它会将指针设置为指向数组的第一个元素。所以给定数组arr上面声明,你可以做char* ptr = arr , 和 char* ptr = &arr[0] 一样.

4:在所有其他情况下,像这样的语法会使指针指向一个右值(松散地说,一个临时对象,你不能获取它的地址),这通常是非法的。 (你不能这样做 int* ptr = &42 )。但是,当您定义字符串文字(例如 "foo" )时,它不会创建右值。相反,它使用静态存储创建 char 数组。您正在创建一个静态对象,它是在加载程序时创建的,当然指针可以安全地指向 that

5:字符串字面量实际上需要标记为const (因为它们是静态的和只读的),但是因为 C 的早期版本没有 const关键字,您可以省略 const说明符(至少在 C++11 之前),以避免破坏旧代码(但您仍然必须将变量视为只读)。

所以 char* ch = "123"真正的意思是:

  1. 写入 char 数组 {'1', '2', '3', '\0'}到可执行文件的静态部分(这样当程序加载到内存中时,这个变量会在内存的只读部分中创建)
  2. 当这行代码执行时,创建一个指向该数组第一个元素的指针

作为一个有趣的事实,这与 char ch[] = "123"; 不同。 ,而是意味着

  1. 写入 char 数组 {'1', '2', '3', '\0'}到可执行文件的静态部分(这样当程序加载到内存中时,这个变量会在内存的只读部分中创建)
  2. 当执行这行代码时,在堆栈上创建一个数组,其中包含这个静态分配的数组的拷贝。

关于c++ - 如何理解 char * ch ="123"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238893/

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