我在理解指针的使用方面遇到了一些麻烦。具体来说,我对以下代码行感到困惑:
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";
}
我有两个问题:
这段代码是否合法?通过观看一些哈佛CS 50视频,我认为它是。
如果(1)的答案是肯定的,那么我很困惑。我认为语句的含义:“char * s”是你想要创建一个名为s的新变量,它的类型为char *。这意味着s是指向某个char变量的指针(此时,我们甚至不知道这个char变量是什么)。如果是这种情况,那么上面代码行的右侧应该是内存中的地址,而不是字符串。
我会更喜欢这样的事情:
char* s = "my String";
编辑/更新:感谢所有出色的答案。 David K的回答让事情变得更加清晰(我喜欢一步一步的结构),但我在某些方面仍然有些困惑。
在David K的回答的第1步中,他说
它会在某处保留10个字节的内存。
但它必须保留超过10个字节,对吧?对于内存中地址的内容,我们需要10个字节的字符串加上 4个字节的内容。
您是否同意以下内容:因此,如果我们坚持使用“变量 - 容器”类比,那么
char s[10] = "my string"; //10 because including extra space for null 0
char* AddressOfs = &s;
保留14个字节的存储空间(10个用于字符串的内容,4个用于字符串内容的地址),但只有一个“容器”。此容器名为s并保存4个字节。保存字符串内容的10个字节是“无容器”,即这10个字节在内存中的某处分配,但没有标签可以与这10个字节相关联。 (我不是说我们无法访问这10个字节。我只是说没有正式的变量标签应用于这10个字节。)
答案 0 :(得分:5)
如果源文件中有这行代码,
char* s = "my String";
这是你的计划将要做的事情:
s
声明为char*
。s
的值设置为字符'm'
所在的那10个字节内存的第一个字节的地址。所以它与此并没有太大区别:
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";
指向字符串文字的事实,你不能(甚至尝试)修改它。尝试这样会调用未定义的行为。