我在理解指针的使用方面遇到了一些麻烦.具体来说,我对以下代码行感到困惑:
char* s = "my String";
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
这段代码甚至合法吗?通过观看一些哈佛CS 50视频,我认为它是.
如果(1)的答案是肯定的,那么我很困惑.我认为语句的意思是:"char*s"是你想要创建一个名为s的新变量,它的类型为char*.这意味着s是指向某个char变量的指针(此时,我们甚至不知道这个char变量是什么).如果是这种情况,那么上面代码行的右侧应该是内存中的地址,而不是字符串.
我会更喜欢这样的事情:
char s[10] = "my string"; //10 because including extra space for null 0
char* AddressOfs = &s;
Run Code Online (Sandbox Code Playgroud)
编辑/更新:感谢所有的好答案.David K的回答让事情变得更加清晰(我喜欢一步一步的结构),但我在某些方面仍然有些困惑.
在大卫K的回答的第一步,他说
它会在某处保留10个字节的内存.
但它必须保留超过10个字节,对吧?我们需要10个字节的字符串内容加上 4个字节的内存地址内容.
您是否同意以下内容:因此,如果我们坚持使用"变量 - 容器"类比,那么该行
char* s = "my string";
Run Code Online (Sandbox Code Playgroud)保留14个字节的存储空间(10个用于字符串的内容,4个用于字符串内容的地址),但只有一个"容器".此容器名为s并保存4个字节.保存字符串内容的10个字节是"无容器",即这10个字节在内存中的某处分配,但没有标签可以与这10个字节相关联.(我不是说我们无法访问这10个字节.我只是说没有正式的变量标签应用于这10个字节.)
如果源文件中有这行代码,
char* s = "my String";
Run Code Online (Sandbox Code Playgroud)
这是你的程序将要做的:
s为char*.s为字符'm'所在的那10个字节内存的第一个字节的地址.所以它与此并没有太大的不同:
const char s_buffer[10] = "my String";
char* s = &s_buffer[0];
Run Code Online (Sandbox Code Playgroud)
您可能注意到的一个区别是,在第一种情况下,没有s_buffer可以单独使用的符号s.在第一个例子中,如果那么下一行s = "another string"(至少在原理上)你将失去读取s最初指向的10个字节的能力.