C++ 如何找到字符串文本的地址?

C++ 如何找到字符串文本的地址?,c++,c,string,string-literals,C++,C,String,String Literals,假设我有以下几点: char *a = "Learning CPP"; char *b = "Learning CPP"; 我可以说使用的总内存是sizeof(a)而不是2*sizeof(stringliteral)吗 因为我对字符串文字的理解是存储了字符串的一个副本。但是, 它不是存储在a,a+1,a+2….之间吗。。。。。内存中的a+12地址以及b、b+1、b+2。。。内存中的b+12(12是字符串的大小) 你可以自己检查。比如说 if ( a == b ) std::cout <&

假设我有以下几点:

char *a = "Learning CPP";
char *b = "Learning CPP";

我可以说使用的总内存是sizeof(a)而不是2*sizeof(stringliteral)吗

因为我对字符串文字的理解是存储了字符串的一个副本。但是,


它不是存储在a,a+1,a+2….之间吗。。。。。内存中的a+12地址以及b、b+1、b+2。。。内存中的b+12(12是字符串的大小)

你可以自己检查。比如说

if ( a == b ) std::cout << "The string literals are coinside" << std::endl;
else std::cout << "The string literals occupy different areas of memory" << std::endl;

if(a==b)std::cout下面的代码将显示变量和字符串的位置

printf( "variable a is at address %p\n", &a );
printf( "variable b is at address %p\n", &b );
printf( "the string that a points to is at address %p\n", a );
printf( "the string that b points to is at address %p\n", b );
请注意,最后两行可能打印相同的地址,也可能不打印相同的地址,具体取决于编译器。编译器不需要只创建一个字符串

如何找到字符串文本的地址

您已找到字符串文字的地址。字符串文字的值是其第一个字符的地址。您将该值分配给
a
b


我能说使用的总内存是sizeof(a)而不是2*sizeof(a)吗

首先,这个问题的形式不正确
sizeof(a)
是指针的大小

你想问:


我可以说字符串文本使用的总内存是一个字符串副本所需的大小,而不是两个字符串副本所需的大小吗

不,这是编译器的实现细节。它可能会选择实习或不在它的突发奇想字符串。如果修改其中一个字符串,则由实现定义是否观察到另一个字符串被修改

这是一个更普遍的事实的结果,即如果您修改其中一个字符串,则所发生的事情是由实现定义的,周期。任何事情都有可能发生

我对字符串文字的理解是存储了字符串的一个副本

你的理解是错误的。这不是语言的保证。这是编译器可以选择进行或不进行的优化

它不是存储在a,a+1,a+2….之间吗。。。。。内存中的a+12地址以及b、b+1、b+2。。。内存中的b+12(12是字符串的大小)


我不能理解这个问题。没有被存储的“it”是什么?

我能说使用的总内存是sizeof(a)而不是2*sizeof(a)吗? -->不,sizeof(a)是sizeof(char*)=4

它不是存储在a,a+1,a+2….之间吗。。。。。内存中的a+12地址以及b、b+1、b+2。。。内存中的b+12(12是字符串的大小)? -->使用gcc编译器,当字符串相等时,a和b是相同的地址。当字符串不同时,我发现不同的a和b是不同的地址。(嘿,这是一个有趣的练习..我学到了一些新东西)

\include
#包括
使用名称空间std;
int main()
{
char const*p=“你好”;
printf(“%d”,p);//打印第一个字节的地址

C变量
a
b
保存地址。它们是否相同取决于编译器(C标准不强制执行任何操作——我不知道C++)C++标准也不强制执行任何操作。VC++也可以执行任何操作,具体取决于编译器选项。(这与C++中变量必须是
const char*
这一事实无关)Sizeof(a)给出了名为a的指针的大小,而不是它指向的对象的大小。允许但不要求编译器合并字符串文字。这意味着相同的字符串文字在通过指针进行比较时可能相等,也可能不相等。即使表达式“foo”==“foo”是否返回true也是由实现定义的。“是的。他们有。谢谢。我不知道为什么我自己没有想到这个。谢谢你的回答。我说的是字符串。碰巧a==b。所以我现在清楚了。你可能确实想写“值”,但我想你是指“地址”这里。@MooingDuck:我向你保证我没有。我们这里有一个变量赋值。赋值将右操作数的值转换为左操作数的类型,然后对转换后的值进行赋值。然后问题是右操作数的值是什么?答案是:第一个变量的地址绳子的拉手。
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char const* p ="Hello"; 
printf("%d",p); //prints the address of the first byte. ie of 'H' 
cout<<p[0] // prints H
cout<<p[1] //prints e
}