我很难理解或找到const char** x
是什么以及如何使用它的简单解释?
我有点明白char* x[]
是一个char指针数组。
我发现char** x
的一个解释说“它们是指向const chars
的变量指针数组的变量指针。”
我很困惑。 x
是一个指针数组还是只指向一个指针数组的指针?
答案 0 :(得分:2)
如果我写了T *x
,你会理解,我认为? x
只是指向T
类型对象的指针。该对象可能是T
数组中的第一个元素。而T x[10]
实际上是一个10 T
的数组。
在您的情况下,T
为const char *
。因此x
是指向const char *
的指针。
答案 1 :(得分:0)
[]
它主要是声明事物数组的快捷方式,而不是真正的类型。它在声明数组元素或指定数组有多少“插槽”时使用。
但是C不会像处理整个数组一样处理整个数组,所以从该操作得到的结果变量是指向该数组的第一个元素的char *
指针,因此{{1和} char x[]
有点暗示是同一类型。
例如,当声明char *x
时,char x[] = "string";
是x
类型的变量,指向数组的第一个元素char *
,其值为{{1} }}
您可以将概念重新应用于矩阵或数组数组,这与指向指针集合的指针相同。
因此虽然x[0]
可能是字符串,但's'
可能是字符串列表。
答案 2 :(得分:0)
对于您使用的每种类型*
,它是指向该类型的指针。它可能指向一个元素或指向内存中元素序列的第一个元素(在第一次分配它时)。使用指针,您可以使用pointer arithmetik例如x++
导航到下一个元素,您也可以在其上使用索引运算符x[1]
。指针arithmetik不能应用于const指针,因为你声明它是常量,所以很明显。
对于您使用的每种类型[]
,它都是一个数组。使用数组,你不能使用指针arithmetik,只有[]
运算符允许你访问数组的元素。
你可以说const指针在访问元素时类似于数组。
在编译时知道应该具有的大小时使用数组。这些将驻留在堆栈上。
在运行时必须分配内存或使用指针arithmetik时使用指针。在运行时分配的内存驻留在堆上。
此处lecture可能会帮助您更好地理解。
我希望我没有说出任何错误,因为我最后一次使用C已经有一段时间了:/
答案 3 :(得分:0)
以下是一个例子:
char ch;
char *pch = &ch;
char **ppch = &pch;
在这种情况下,不涉及任何数组。
有一个变量包含一个字符(ch
)。
然后有一个变量包含一个指针(pch
)。这只是存储器中保存数据的位置的地址。但是编译器和程序员也对存储在该位置的值的类型感兴趣(例如,知道它需要多少字节,或者该值允许哪些操作)。因此指针的类型与它指向的值的类型相关。在这种情况下,pch
指向一个字符值,因此类型为char *
。
然后还有另一个包含指针的变量(ppch
)。同样,它只是内存中某个位置的地址,但这次存储在该位置的值是一个指针。所以有两个指针,ppch
和它指向的指针。两个指针都有一个类型。 ppch
是char **
- 指向char的指针。它指向的值是char *
- 指向字符的指针。
指针可以指向单个值,但在某些情况下,如果存在一系列具有相同类型(数组)的值,它也很有用。在这种情况下,指针可以指向序列中的任何值,并且可以使用指针算法将其更改为指向同一序列中的其他值。
所以就像char *
是一个可以指向一个字符的指针一样,它也可以指向一个字符序列中的任何值,并且在很多情况下,如果它指向一个字符的第一个值,它是有用的。序列
char **
指向char *
值,该值也可以是单个值,也可以是值序列中的多个值之一(更具体地说,序列中的第一个值)。
这与指针的实际序列char *array[]
不同。差异很重要:
char *pointers[5];
char **pp;
这里,char *pointers[5]
是一个包含5个指针的数组。这是实际的顺序。 sizeof(pointers)
是单个指针大小的5倍。
但是pp
只是一个指针 - 它是一个包含单个指针的变量,sizeof(pp)
是单个指针的大小。因为它是指向指针的指针,它也可以指向pointers
的第一个元素(或任何其他char *
值,包括pointers
的其他元素。)
现在只有const
的问题。这只会影响它出现的类型(这有点令人困惑,因为C允许不同的订单,而const char
与char const
相同)。所以const char **pp
是一个非const指针(意思是指针可以改变)到非const指针(这样指针也可以改变)到一个const char(意味着该字符的值不能被{修饰) {1}})。
所以程序可以改变pp
本身 - 它可以指向不同的指针。它指向的指针也可以改变 - 它可以指向不同的字符。但是使用pp
无法更改字符本身。
对于一个合理的例子,我们需要一些pp
指针,并指向一些字符。获得这些的最简单方法是使用数组:
const char
请注意char seq1[5] = { 'a', 'b', 'c', 'd', 'e' };
char seq2[3] = { 'x', 'y', 'z' };
const char *p1;
const char *p2;
const char **pp;
p1 = &seq1[0]; /* valid, same as p1 = seq1 */
p1 = &seq1[3]; /* valid */
*p1 = 's'; /* invalid - the character that p1 points to cannot be changed by p1 */
p2 = seq2; /* valid */
pp = &p1; /* valid */
*pp = &seq1[2]; /* valid - pp is a non-const pointer, so the value it points to can change */
pp = &p2; /* valid - pp itself is non-const */
**pp = 't'; /* invalid - same as *(*pp) which is *p2 which is const when accessed by pp */
的含义并不是值不能改变,而是const变量(或const指针)不能改变它。以下示例应澄清:
const