鱼C论坛

 找回密码
 立即注册
查看: 3073|回复: 9

[已解决]s1e23课后作业求助

[复制链接]
匿名鱼油
匿名鱼油  发表于 2021-9-30 10:20:54 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
        char *(*p)[5] = &array;
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; *(*(*p + i) + j) != '\0'; j++)
                {
                        printf("%c ", *(*(*p + i) + j));
                }
                printf("\n");
        }

        return 0;
}
为什么是 *(*p)[5],难道是因为array是一个类似于二级指针的东西,所以也得放到二级指针来存放吗?








最佳答案
2021-9-30 12:32:43
你看哈,首先array是一个数组,存放指针,所以是一个指针数组,我们要用定义一个指针指向这个指针数组,那要用什么类型的指针呢?我们举个例子,比如int a=5, 那么我们要定义一个指向int型的指针,也就是int(*p),而本体array的类型是char*[5],所以能我们定义的就应该是指向char*[5]的指针,所以应该是这样定义char*(*p)[5]=&array滴
回复

使用道具 举报

发表于 2021-9-30 11:07:54 | 显示全部楼层

回帖奖励 +5 鱼币

你可以试着用二维数组的思维去理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-30 11:14:38 | 显示全部楼层

回帖奖励 +5 鱼币

当时学到指针就放弃了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-30 12:32:43 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +5 鱼币

你看哈,首先array是一个数组,存放指针,所以是一个指针数组,我们要用定义一个指针指向这个指针数组,那要用什么类型的指针呢?我们举个例子,比如int a=5, 那么我们要定义一个指向int型的指针,也就是int(*p),而本体array的类型是char*[5],所以能我们定义的就应该是指向char*[5]的指针,所以应该是这样定义char*(*p)[5]=&array滴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-30 12:41:58 | 显示全部楼层
本帖最后由 wyz20010429 于 2021-9-30 12:47 编辑

不用非要想它是什么二级指针,我们只需知道他是个指针,指向什么类型,事实上,抛开这题,我们一般看到一个指针要想到四个角度指针本身类型,指针所指向类型,指针的值(跨度),指针自身所占内存空间,希望对你有所帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-30 13:13:20 | 显示全部楼层

回帖奖励 +5 鱼币

心驰神往 发表于 2021-9-30 11:14
当时学到指针就放弃了

我也是,转去学python了,C语言往后遭不住啊,太难顶了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-30 13:16:57 | 显示全部楼层

回帖奖励 +5 鱼币

咱们一步一步的来看:
(1)char array[5]是一个数组,里面存的是char类型的数据。

(2)char *array[5]是一个指针数组,说白了,也还是个数组,只不过这次数组中存放的是char类型的指针。
例如:此时array[0]的取出值是“FishC”这个字符串的首地址,
而*array[0]则是对该地址进行解引用,取出该地址中存储的值,即 ‘F’。

(3)char  *(*p)[5]对照着(2)来看,p就是一个指向指针数组的指针,
既然p是一个指针,那么它存储的必然是一个地址。只不过这个地址需要是char*[5]类型的地址(即指针数组的地址)
所以就有了char *(*p)[5] = &array;
这条语句相当于:
char *(*p)[5];//定义一个指向指针数组的指针p
p = &array;// 把array的地址赋值给p。

所以此时p指向的array这个指针数组的首地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-30 14:08:45 | 显示全部楼层
番杰 发表于 2021-9-30 13:16
咱们一步一步的来看:
(1)char array[5]是一个数组,里面存的是char类型的数据。

如果直接用char (*p)[5] = &array;呢 p此时也是指向指针数组的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-30 14:20:01 | 显示全部楼层
guiding 发表于 2021-9-30 14:08
如果直接用char (*p)[5] = &array;呢 p此时也是指向指针数组的指针


char (*p)[5]
这个不是指向指针数组的指针;
这是数组指针,是一个指向数组的指针。

char (*p)[5] 和char *(*p)[5]是不一样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-3 14:48:47 | 显示全部楼层
番杰 发表于 2021-9-30 13:16
咱们一步一步的来看:
(1)char array[5]是一个数组,里面存的是char类型的数据。

指针和数组的管线太绕了,卡在这里已经一个月了。所有的业余时间都搭进去,受不了了,到求助里看看各位高手的解答。慢慢的,发现各种解答也看不明白了。
现在初步把指针理解为比对应的数组高一个维度,也就是数组是一个线,对应的指针算是增加了一个变化,一次取出是数组的地址,外扩一次取出才是里面的数值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表