什么是之间的“* S”和“S”变量的区别?

时间:2019-02-02 18:53:07

标签: c syntax

如果我有这个变量:

char *s = "house";

如果我在代码的其他部分将其称为*ss有什么区别?

3 个答案:

答案 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)

*ss[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)使用相同的操作者(*),其用于解除引用一个指针的一个。