【发布时间】:2014-02-14 09:37:07
【问题描述】:
char str[100];
char *q;
q 和 str 有什么区别....不是都char*
请注意,我说的是str,而不是str[100]
【问题讨论】:
-
尝试编译
str++;,你会发现一个重要的区别。 -
sizeof(str) =100bytes
char str[100];
char *q;
q 和 str 有什么区别....不是都char*
请注意,我说的是str,而不是str[100]
【问题讨论】:
str++;,你会发现一个重要的区别。
char str[100];
str 是数组对象的名称。它不是真正意义上的指针。
但与任何数组类型的表达式一样,在大多数情况下,它会隐式转换为数组第一个元素的地址(或等效的指针)。这种隐式转换产生一个指针值;没有指针object,所以没有什么可以修改的。 (结果指针值的类型为char*,而不是const char* 或char *const。)
此处适用的例外情况是 str 是一元 & 或 sizeof 运算符的操作数。
char *q;
q 是指针对象的名称,与几乎所有非const 对象一样,它可以被修改。
请参阅comp.lang.c FAQ 的第 6 节。
【讨论】:
q 是一个未初始化的指针,而str 指向某处分配了 100 个字节。
另外,您可以更改q 指向的位置。但是以后不能更改str的地址。
【讨论】:
q 而不能更改str
q 是一个可以更改的指针。 str 是一个不能改变大小的数组,但它的内容可以。
str 不是指针。
按照惯例,数组的名称是一个常量,它的值是它的第一个元素的地址。
在大多数情况下,当str 用于表达式或语句时,它会隐式转换为数组第一个元素的地址。 sizeof 运算符是一个例外。在这种情况下 (sizeof(str)),str 是数组本身,它不会被转换为地址,这就是为什么 sizeof(str) 结果为 100。
【讨论】:
sizeof str的结果。不,str 可能被隐式转换到的指针值不是const。
char *const,即指向非常量char的常量指针。你所拥有的是一个指向常量字符的非常量指针。
char*。 str 的声明不会创建指针对象,因此不需要 const 以避免修改任何指针对象。同样,2+2 的值属于int,而不是const int。
const,并且数组名称不会总是 转换为指针值。想想你的答案对sizeof str 的结果意味着什么。
就访问字符串中的数据而言,是的,str 可以被认为是char*,或者更准确地说是char *const,因为您不能为str 分配不同的地址。
严格来说,它们是不同的类型,这就是为什么不能为str 分配新值的原因。把它想象成编译器:每个变量只是一个特定地址的标签,它将为你分配。 str,代表一个由100个chars组成的缓冲区的起始地址,但q是一个地址的地址,而后者又是一个char的地址。
您可以更改变量的 值,但不能更改(在运行时)放置变量的位置(即其地址)。
【讨论】:
char* const?
str 是常量,而q 不是
const char* 和 char const* 意思相同,与 char *const 不同
在该示例中,str 是 char[100] 类型,而 q 是指向 char 的指针。它可以指向 char 类型的任何单个数组元素,但不能指向 char 类型的数组。
【讨论】:
q 不能指向 char 的数组。它可以指向char数组的一个元素;然后,您可以使用指针算法来访问数组的其他元素。