正在将c字符串的地址转储到ostream
Dumping address of a c-string to an ostream?
我正在学习指针,但我不明白指针是如何与C风格字符串一起工作的。为什么这两个相等?
char a[] = "Gme";
char* p = a; //Why am I allowed to assign "Gme" to a pointer (pointer is an address)
cout << p << " " << *(p+1); //Why does it print "gme" with "cout<<p" (I mean, I am printing an address)?
和
char a[] = "Gme";
char* p = &a[0]; // How is this the same as char* p = a;
cout << p << " " << *(p+1);
总的来说,我不明白指针是如何处理字符串的。字符是如何存储在内存中的?如果我们将字符串视为一个字符数组,为什么我不能打印字符元素的地址?
提前感谢:(
这与它们是C样式字符串无关。任何数组都是如此。例如,你可以做:
int arr[10];
int* p = arr;
之所以可以这样做,是因为有一种称为数组到指针转换的标准转换。这将表示数组的表达式(如上面的arr
(转换为指向其第一个元素的指针。我们知道arr
的第一个元素是int
,所以我们从这个转换中得到的指针是int*
。
char a[] = "Gme";
char* p = a;
在这个例子中,我们知道a
是char
的一个数组。它有4个元素:字母G
、m
、e
和终止空字符。当您用a
初始化p
时,您正在执行数组到指针的转换,以获得指向数组第一个元素的指针。第一个元素是字符G
,因此p
是指向该字符的指针。
std::cout
(以及标准I/O库的其余部分(在输出char*
时只有特殊的重载。它不是简单地打印指针包含的地址,而是假设指针指向以null结尾的字符串中的第一个字符(通常是正确的(。它只会使字符串中的每个字母递增和取消引用您传递的指针。
总的来说,我不明白指针是如何处理字符串的。字符是如何存储在内存中的?
这是一个已经得到回答的大问题。
chars[]和char*s之间有什么区别?是一个很好的起点。
如果我们将字符串视为一个字符数组,为什么我不能打印字符元素的地址?
你可以。你只需要做一些额外的工作来向编译器澄清你想要的是什么。
<<
运算符有一个重载,它接受一个ostream和一个char*
,后者将右操作数解释为以NUL结尾的字符串。
如果您希望cout << ...
只看到p
的指针,而不看到它的字符串,那么将其强制转换为void*
,以便函数调用调度器在选择使用哪个operator<<
重载时,唯一可用的选项是将其视为指针的选项。
C字符串是由char
元素组成的数组。
数组是内存中的一系列值,不能存储在单个变量中(因为变量通常限制为64位(,因此变量指向数组中的第一个元素(例如,包含第一个元素的地址(。
所以char a[] = "Gme"
创建一个由"G"、"m"answers"e"组成的数组,并将其存储在内存中,a
包含第一个元素(在本例中为"G"(的地址。
char* p = a;
是有效的,因为a
是作为指针隐式创建的,所以您只是将数组的第一个元素的地址重新分配给p。
char* p = &a[0];
是有效的,因为a[0]是a
的第0个元素处的值。通过添加&
,您将获得a
的第0个元素的地址。所以p现在指向数组a
的第一个元素,所以现在p也可以被视为数组。
- 分段故障(堆芯转储)矢量
- Cppcheck生成xml转储文件
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 正在处理故障(堆芯转储)
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 我不知道为什么这段代码会让核心被转储?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 带"bad"的 windbg 核心转储分析地址
- 正在将c字符串的地址转储到ostream
- gdb与xxd转储中的地址
- 核心转储,<地址0x5bf6越界>