我很难理解或找到关于它是什么const char** x
以及如何使用它的简单解释?
我有点理解这char* x[]
是一个字符指针数组。
我发现的一种解释char** x
是“它们是指向变量指针数组的变量指针const chars
”。
我很困惑。是x
指针数组还是只是一个指向指针数组的指针?
我很难理解或找到关于它是什么const char** x
以及如何使用它的简单解释?
我有点理解这char* x[]
是一个字符指针数组。
我发现的一种解释char** x
是“它们是指向变量指针数组的变量指针const chars
”。
我很困惑。是x
指针数组还是只是一个指向指针数组的指针?
如果我写了T *x
,你会明白的,我猜? x
只是一个指向类型对象的指针T
。该对象可能是数组中的第一个元素T
。而T x[10]
实际上是 10 的数组T
。
在你的情况下,T
是const char *
。x
指向 a 的指针也是如此const char *
。
[]
它主要是声明事物数组的快捷方式,而不是真正的类型。它在声明数组元素或指定该数组有多少个“槽”时使用。
但是 C 不会像处理一个单一的东西一样处理整个数组,因此您从该操作获得的结果变量是char *
指向该数组的第一个元素的指针,因此char x[]
在char *x
某种程度上暗示是同一类型。
char x[] = "string";
例如,当声明是一个指向数组第一个元素的x
类型变量时,其值为。char *
x[0]
's'
您可以将该概念重新应用于矩阵或数组数组,这与指向指针集合的指针相同。
所以 whilechar *x
可能是一个字符串,也可能是一个字符串char **x
列表。
对于您使用的每种类型,*
它都是指向该类型的指针。它可能指向内存中一系列元素的一个元素或第一个元素(在您第一次分配它时)。例如,使用指针可以使用指针算术x++
导航到下一个元素,也可以x[1]
在其上使用索引运算符。指针算术不能应用于 const 指针,因为你声明它是常量,所以很明显。
对于您使用的每种类型,[]
它都是一个数组。对于数组,您不能使用指针算法,只有[]
运算符允许您访问数组的元素。
在访问元素时,您可以说 const 指针类似于数组。
当您在编译时知道它应该具有什么大小时,请使用数组。这些将驻留在堆栈上。
当您必须在运行时分配内存或您必须使用指针算法时,请使用指针。运行时分配的内存驻留在堆上。
这里有一个讲座,可以帮助你更好地理解。
我希望我没有说任何错误,自从我上次使用 C 以来已经有一段时间了:/
这是一个例子:
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 */