0

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

我有点理解这char* x[]是一个字符指针数组。

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

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

4

4 回答 4

2

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

在你的情况下,Tconst char *x指向 a 的指针也是如此const char *

于 2013-03-03T00:34:14.360 回答
0

[]它主要是声明事物数组的快捷方式,而不是真正的类型。它在声明数组元素或指定该数组有多少个“槽”时使用。

但是 C 不会像处理一个单一的东西一样处理整个数组,因此您从该操作获得的结果变量是char *指向该数组的第一个元素的指针,因此char x[]char *x某种程度上暗示是同一类型。

char x[] = "string";例如,当声明是一个指向数组第一个元素的x类型变量时,其值为。char *x[0]'s'

您可以将该概念重新应用于矩阵或数组数组,这与指向指针集合的指针相同。

所以 whilechar *x可能是一个字符串,也可能是一个字符串char **x列表。

于 2013-03-03T00:44:25.577 回答
0

对于您使用的每种类型,*它都是指向该类型的指针。它可能指向内存中一系列元素的一个元素或第一个元素(在您第一次分配它时)。例如,使用指针可以使用指针算术x++导航到下一个元素,也可以x[1]在其上使用索引运算符。指针算术不能应用于 const 指针,因为你声明它是常量,所以很明显。

对于您使用的每种类型,[]它都是一个数组。对于数组,您不能使用指针算法,只有[]运算符允许您访问数组的元素。

在访问元素时,您可以说 const 指针类似于数组。

当您在编译时知道它应该具有什么大小时,请使用数组。这些将驻留在堆栈上。

当您必须在运行时分配内存或您必须使用指针算法时,请使用指针。运行时分配的内存驻留在堆上。

这里有一个讲座,可以帮助你更好地理解。

我希望我没有说任何错误,自从我上次使用 C 以来已经有一段时间了:/

于 2013-03-03T01:01:51.593 回答
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 倍。

Butpp只是一个指针 - 它是一个包含单个指针的变量,并且sizeof(pp)是单个指针的大小。由于它是指向指针的指针,因此它也可以指向 的第一个元素pointers(或指向任何其他char *值,包括 的其他元素pointers)。

现在只有const. 这只会影响它出现的类型(这有点令人困惑,因为 C 允许不同的顺序,并且const char与 相同char const)。非常const char **pp量指针(意味着指针可以更改)到非常量指针(因此指针也可以更改)到 const char(意味着字符的值不能被 修改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 指针)改变。以下示例应阐明:

char ch;
char *pch = &ch;
const char *cpch = &ch;

ch = 'a';  /* fine - ch is not const */
*pch = 'b';  /* fine - pch does not point to a const value */
*cpch = 'c';  /* invalid - cpch points to a const value */
于 2013-03-03T01:24:31.300 回答