合法使用char *

时间:2015-08-11 21:28:36

标签: c string pointers

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

foreach ($_POST as $key => $value) {

     $$key = $_POST[$key];  //assigns variable to input.

    }

if(!empty($$key)) {

//code if all fields are not empty  

}
else {

    echo "Please fill in all fields";

}

我有两个问题:

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

  2. 如果(1)的答案是肯定的,那么我很困惑。我认为语句的含义:“char * s”是你想要创建一个名为s的新变量,它的类型为char *。这意味着s是指向某个char变量的指针(此时,我们甚至不知道这个char变量是什么)。如果是这种情况,那么上面代码行的右侧应该是内存中的地址,而不是字符串。

  3. 我会更喜欢这样的事情:

    char* s = "my String";
    

    编辑/更新:感谢所有出色的答案。 David K的回答让事情变得更加清晰(我喜欢一步一步的结构),但我在某些方面仍然有些困惑。

    1. 在David K的回答的第1步中,他说

        

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

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

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

        char s[10] = "my string"; //10 because including extra space for null 0  
        char* AddressOfs = &s;
        
      2. 保留14个字节的存储空间(10个用于字符串的内容,4个用于字符串内容的地址),但只有一个“容器”。此容器名为s并保存4个字节。保存字符串内容的10个字节是“无容器”,即这10个字节在内存中的某处分配,但没有标签可以与这10个字节相关联。 (我不是说我们无法访问这10个字节。我只是说没有正式的变量标签应用于这10个字节。)

3 个答案:

答案 0 :(得分:5)

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

char* s = "my String";

这是你的计划将要做的事情:

  1. 它会在某处保留10个字节的内存。
  2. 它会放置" my String" (包括终止null)在那十个字节的内存中。
  3. 它会将s声明为char*
  4. 它会将指针s的值设置为字符'm'所在的那10个字节内存的第一个字节的地址。
  5. 所以它与此并没有太大区别:

    const char s_buffer[10] = "my String";
    char* s = &s_buffer[0];
    

    您可能会注意到的一个区别是,在第一种情况下,没有符号s_buffer可以与s分开使用。在第一个示例中,如果下一行是s = "another string",那么(至少在原则上)您将失去读取s最初指向的特定10个字节的能力。

答案 1 :(得分:3)

char* s = "my String";声明一个字符串常量和指向它的指针。这比使用printf电话中的裸字符串更合理。但请注意,因为你有一个指向你的字符串的指针,你可能会试图修改它 - 是未定义的行为。

答案 2 :(得分:2)

在你的情况下

 char* s = "my String"

是合法且有效的,因为像"my String"这样的表示被称为字符串文字,表示本质上给出字符串中第一个元素的地址,这也是指向一个char。因此,我们可以将其存储在指向char的另一个指针中。

可用性,与<{1}}大致相同,除了在前一种情况下,char s[10] = "my string";指向字符串文字的事实,你不能(甚至尝试)修改它。尝试这样会调用未定义的行为。