const char ** x和const char * x []如何相似?

时间:2013-03-03 00:30:11

标签: c++

我很难理解或找到const char** x是什么以及如何使用它的简单解释?

我有点明白char* x[]是一个char指针数组。

我发现char** x的一个解释说“它们是指向const chars的变量指针数组的变量指针。”

我很困惑。 x是一个指针数组还是只指向一个指针数组的指针?

4 个答案:

答案 0 :(得分:2)

如果我写了T *x,你会理解,我认为? x只是指向T类型对象的指针。该对象可能T数组中的第一个元素。而T x[10]实际上是一个10 T的数组。

在您的情况下,Tconst 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和它指向的指针。两个指针都有一个类型。 ppchchar ** - 指向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 charchar 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