如果我有这个变量:
char *s = "house";
如果我在代码的其他部分将其称为*s
和s
有什么区别?
答案 0 :(得分:3)
如何将字符串称为所有字符,而不仅仅是第一个字符?
在C语言中,代码并不直接引用 string 的所有字符。 char *s
指向单个字符。按照标准C库的约定,当该字符以 string 开头时,则认为s
指向字符串,但仍然仅是字符串的第一个字符。通过检查该字符及其后的字符,直到并包括一个空字符,该代码才知道所有字符串。
char x = *s; // x assigned the value of the first character pointed to by s.
size_t len = strlen(s); // len assigned the _length_ of the string
// Length determined by walking the string until finding a null character '\0'.
// t is assigned the same pointer value as s. Data they reference is not replicated.
// t and s both point to the same string.
char *t = s;
char u[strlen(s) + 1];
strcpy(u, s); // String data pointed to by s is coped to u.
在C: “A 字符串是字符的连续序列通过终止并且包括第一空字符”
答案 1 :(得分:2)
*s
和s[0]
是同一回事,如果有帮助的话。在这种情况下,它们是字母h
,并且将直到/除非s
被改变。 (h
不应更改,并且根据您的C实现,可能无法更改,因为"house"
是常量字符串文字。)
如果在期望char *
的上下文中使用它,则s
是整个字符串。但重要的是要记住,即使它最初指向的是一个常量,它也不是常量。
通过对比,
char c[] = "house";
用不可变的值声明并初始化c
。您可以在关键字const
前面加上前缀,以使内容更清楚,但这仅仅是修饰。因为它是用括号初始化,其在指针意义价值不能被改变,并且由于其初始值也是一个常数,即不能改变。请注意,由于字面量的分配,您只能在不给出数组长度的情况下走开-由于字面量的长度,编译器可以告诉它是6个字符的数组。如果 did 指定一个长度,那么如果没有const
关键字,它就不会是不变的。
答案 2 :(得分:0)
当你指的是变量为*var
,你是解引用它,语句的即值*var
是什么var
指向。当你指的是变量为var
(无*
),则正在访问其实际内容,其可以或可以不包含含有存储器地址的值的数据您想< / p>
这可以是因为语法来声明的变量作为指针有点混乱初学者(T *p
)使用相同的操作者(*
),其用于解除引用一个指针的一个。