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

问题描述 投票:2回答:3

如果我有这个变量:

char *s = "house";

有什么区别,如果我在我的代码其他部分参照它作为*ss

c syntax
3个回答
3
投票

我怎么指的是字符串的所有字符,不只是第一个?

在C,代码不直接引用一个字符串的所有字符。 char *s指向单个字符。通过标准C库的惯例,当该字符开头的字符串,然后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:“的字符串是由封端的字符的连续序列,并且包括第一个空字符。”


2
投票

*ss[0]是一回事,有没有什么帮助。在这种情况下,他们是信h,并将于直到/除非s改变。 (该h不应该改变,并根据您的C实现,可能无法改变,因为"house"是一个常量字符串文字。)

如果在期望一个char *的上下文中,s是整个字符串。但要记住,这是不是一个常数是很重要的,即使什么它最初指向是。

相比之下,

char c[] = "house";

声明并有一个不变的值初始化c。你可以在前面加上const关键字做出更清晰,但是这将是纯粹的装饰。因为它是用括号初始化,其在指针意义价值不能被改变,并且由于其初始值也是一个常数,即不能改变。请注意,您只能获得远没有说明,因为文字的分配的数组的长度 - 编译器可以告诉它是因为文字的长度的6字符数组。如果你没有给它的长度,那么它不会是没有const关键字不变。


0
投票

当你引用变量作为*var,你解引用它,即声明*var的值是什么var点。当你指的是变量作为var(无*),要访问其实际内容,其可能或可能不包含含有你感兴趣的数据的存储器地址的值。

这可以是因为语法变量声明为指针(T *p)有点混乱初学者使用相同的运算符(*)作为用于解引用一个指针的一个。

© www.soinside.com 2019 - 2024. All rights reserved.