合法使用char*

Sam*_* Y. 1 c string pointers

我在理解指针的使用方面遇到了一些麻烦.具体来说,我对以下代码行感到困惑:

char* s = "my String";
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 这段代码甚至合法吗?通过观看一些哈佛CS 50视频,我认为它是.

  2. 如果(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的回答让事情变得更加清晰(我喜欢一步一步的结构),但我在某些方面仍然有些困惑.

  1. 在大卫K的回答的第一步,他说

    它会在某处保留10个字节的内存.

但它必须保留超过10个字节,对吧?我们需要10个字节的字符串内容加上 4个字节的内存地址内容.

  1. 您是否同意以下内容:因此,如果我们坚持使用"变量 - 容器"类比,那么该行

    char* s = "my string";
    
    Run Code Online (Sandbox Code Playgroud)

保留14个字节的存储空间(10个用于字符串的内容,4个用于字符串内容的地址),但只有一个"容器".此容器名为s并保存4个字节.保存字符串内容的10个字节是"无容器",即这10个字节在内存中的某处分配,但没有标签可以与这10个字节相关联.(我不是说我们无法访问这10个字节.我只是说没有正式的变量标签应用于这10个字节.)

Dav*_*d K 5

如果源文件中有这行代码,

char* s = "my String";
Run Code Online (Sandbox Code Playgroud)

这是你的程序将要做的:

  1. 它会在某处保留10个字节的内存.
  2. 它会将"my String"(包括终止null)的字符放在那十个字节的内存中.
  3. 它将声明schar*.
  4. 它将指针的值设置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个字节的能力.