C++ char*name=";“邓肯”;;如果指针只能保存地址,是否有效?

C++ char*name=";“邓肯”;;如果指针只能保存地址,是否有效?,c++,pointers,C++,Pointers,我认为指针只能保存其他变量的地址。那么,我遇到的以下陈述怎么可能是有效的呢?它拿着一根绳子 char * name = "Duncan" 谢谢。它拿着一个指向字符串的指针。那不一样name只包含包含字符串的内存地址 它仍然指向一个字符串。字符串首先放入内存中,name指向该字符串。它已编译到您的程序中,因此可能不明显 指针只能保存指向其他变量的地址 这是不正确的:引用包含其他变量的地址;指针可以保存任何内容的地址,甚至可以不保存任何内容(例如NULL) 在这种情况下,name保存一个7字节的内

我认为指针只能保存其他变量的地址。那么,我遇到的以下陈述怎么可能是有效的呢?它拿着一根绳子

char * name = "Duncan"

谢谢。

它拿着一个指向字符串的指针。那不一样
name
只包含包含字符串的内存地址

它仍然指向一个字符串。字符串首先放入内存中,
name
指向该字符串。它已编译到您的程序中,因此可能不明显

指针只能保存指向其他变量的地址

这是不正确的:引用包含其他变量的地址;指针可以保存任何内容的地址,甚至可以不保存任何内容(例如
NULL


在这种情况下,
name
保存一个7字节的内存块地址,在这种特殊情况下,包含
D
u
n
c
a
n
\0
的ASCII码,编译器将使用数据
Duncan\0
将数组存储在目标文件中的某个位置,指针将指向该位置

是的,指针只包含一个地址。数据在其他地方


这让我不得不说,编写这样的代码并不太好。例如,如果通过指针更改该字符串,则会得到未定义的行为。

这是字符指针的定义。在定义之后,在“=”的右侧有一个常量定义。常量存储在内存中的某个位置,其地址用作“name”的第一个值。 稍后,您将能够为“name”指定其他值。您没有绑定到第一个值,事实上“name”是一个变量。

“Duncan”是一个以null结尾的字符串,因此是一个字符数组(
{'D','u','n','c','a','n','0'}
)<代码>字符*name=“Duncan”将名称设置为数组的地址

<你的语句在C中是可以的,但是在C++中“邓肯”是一个conchar数组,所以你应该使用<代码> const char * name =“邓肯”< /C> > < /P>
顺便说一句,如果不需要更改指针变量名,最好使用
const char name[]=“Duncan”
。这仅为字符串分配内存。示例代码为字符串和指针变量名分配内存。(当然,编译器可能会优化掉名称。)

此“定义”已被弃用。你能猜出原因吗?它并不是真的不受欢迎
“Duncan”
是一个
常量字符
数组,因此在常量正确性方面,您应该编写
常量字符*name=“Duncan”
@user1071136:G++认为这是不推荐的,我在C++11标准中找不到任何允许编译的东西。我仍然不确定为什么这里应该使用
const
。@fdama:当你使用
name[1]+
时会发生什么?。。。。(OK:在大多数情况下,你都在写受保护内存,因为静态常量存在;无论如何,你将改变字符串文字的值:不是你想要的)@ fDAMA:C++中的字符串文字是const,所以你必须使用const。无论如何,在C语言中,处理字符串文字也不是一个好主意。假设一个函数在每次调用中使用相同的字符串文字(例如,将其与输入字符串进行比较)。如果有人修改字符串文字,那么您的函数将意外地更改其行为。