|
发表于 2023-7-29 09:46:44
|
显示全部楼层
首先,我们来解释一下 *(*(*p)[ i]+j) 和 *((*p)[ i]+j) 这两个表达式的含义:
1. *(*(*p)[ i]+j) :
· *p : 这是一个指向指针的指针,指向的是数组 char *array[5] 。
· (*p)[ i] : 这是一个指向 char 类型的指针,指向 array[ i] 这个字符串的首字符。
· *((*p)[ i]+j) : 这是一个 char 类型的值,表示 array[ i] 字符串中的第 j 个字符。
2. *((*p)[ i]+j) :
· *p : 这是一个指向指针的指针,指向的是数组 char *array[5] 。
· (*p)[ i] : 这是一个指向 char 类型的指针,指向 array[ i] 这个字符串的首字符。
· *((*p)[ i]+j) : 这是一个 char 类型的值,表示 array[ i] 字符串中的第 j 个字符,和前面的表达式一样。
现在我们来看一下为什么 *(*(*p)[ i]+j) 无法实现字符串字符逐个输出,而将其替换为 *((*p)[ i]+j) 可以实现:
原因在于对于这个特定的代码片段,我们在声明指针 char *((*p))[5] = &array; 时, p 被声明为一个指向指针的指针,即 **p 。这是因为 *p 与 array 的类型一致,都是指向 char 类型的指针,而数组名 array 在这里退化成了指向首元素的指针。
因此,我们应该使用 **p 来表示 array 数组。所以,在循环输出字符的过程中,应该使用 *((*p)[ i]+j) 来访问数组 array[ i] 中的字符。而 *(*(*p)[ i]+j) 实际上多了一次额外的解引用,导致访问错误的内存地址,从而无法正确输出字符。
修正后的代码如下:
- #include <stdio.h>
- int main()
- {
- char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
- char **p = array; // 将 char *((*p))[5] 替换为 char **p
- int i, j;
- for (i = 0; i < 5; i++)
- {
- for (j = 0; *(*p[ i] + j) != '\0'; j++) // 将 *(*(*p)[ i]+j) 替换为 *((*p)[ i]+j)
- {
- printf("%c ", *(*p[ i] + j));
- }
- printf("\n");
- }
- return 0;
- }
复制代码
这样就可以正确逐个输出字符串的字符了。 |
|