【问题标题】:What's the difference between “*s” and “s” variables?“*s”和“s”变量有什么区别?
【发布时间】:2019-02-02 18:53:07
【问题描述】:

如果我有这个变量:

char *s = "house";

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

【问题讨论】:

  • s 是一个指针。 *s 是它指向的char
  • 将此视为“char* s”与“char *s”。它们是等效的声明,并且将“*”与类型分组以增加清晰度。那么问题是“char*”和“char”类型变量之间有什么区别?后面“*var”的含义会有所不同。
  • *ss[0] 是一回事,如果有帮助的话。在这种情况下,它们是h,直到/除非s 被更改。 (h 不应更改,并且根据您的 C 实现,可能无法更改,因为 "house" 是常量字符串文字。)
  • @EdGrimm 那么如何将字符串称为所有字符,而不仅仅是第一个字符?
  • @LocTran *s 是内存 at s 指向的地址。这不是地址本身。指针是地址。

标签: c syntax


【解决方案1】:

如何将字符串称为所有字符,而不仅仅是第一个?

在 C 中,代码并不直接引用 string 的所有字符。 char *s 指向单个字符。按照标准 C 库的约定,当该字符以 string 开头时,s 被认为指向一个字符串,但仍然只是字符串的第一个字符。通过检查该字符和随后的字符,直到并包括 null 字符,该代码才知道所有 字符串

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 语言中:“string 是一个连续的字符序列,以第一个空字符终止并包括第一个空字符。”

【讨论】:

    【解决方案2】:

    *ss[0] 是一回事,如果有帮助的话。在这种情况下,它们是字母h,直到/除非s 被更改。 (h 不应更改,并且根据您的 C 实现,可能无法更改,因为 "house" 是常量字符串文字。)

    如果在需要char * 的上下文中使用它,s 就是整个字符串。但重要的是要记住它不是一个常数,即使它最初指向的是。

    相比之下,

    char c[] = "house";
    

    用一个不可变的值声明和初始化c。您可以在前面加上 const 关键字以使其更清楚,但这只是装饰。由于它是用括号初始化的,它在指针意义上的值不能改变,而且它的初始值也是一个常数,不能改变。请注意,由于文字的分配,您只能在不给出数组长度的情况下逃脱 - 由于文字的长度,编译器可以判断它是 6 个字符的数组。如果你确实给了它一个长度,那么如果没有const 关键字,它就不会是不可变的。

    【讨论】:

    • 将 c 创建为无法更改的字符数组。”您的意思可能是正确的,但就目前而言,措辞非常混乱。
    【解决方案3】:

    当您将变量称为*var 时,您取消引用它,即语句*var 的值就是var 所指向的值。当您将变量称为var(不是*)时,您访问的是它的实际内容,其中可能包含也可能不包含包含您感兴趣的数据的内存地址的值。

    这对于初学者来说可能有点混乱,因为将变量声明为指针 (T *p) 的语法使用与取消引用指针相同的运算符 (*)。

    【讨论】:

    • 另一方面,如果您按预期阅读,当您阅读声明时,它不会再混淆:*s 即“s 指向的对象是char"
    猜你喜欢
    • 2010-12-14
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多