鱼C论坛

 找回密码
 立即注册
查看: 1453|回复: 3

[已解决]第23课的动手第1题答案没理解

[复制链接]
发表于 2019-3-28 18:51:35 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

int main()
{
    char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};                     // 定义一个指针数组
    char *(*p)[5] = &array;                        // (*p)[5]是数组指针,为什么前面还要再加一个*?
    int i, j;
         
    for (i = 0; i < 5; i++)
    {
        for (j = 0; (*p)[j] != '\0'; j++)                   // 这里(*p)[j]如果是指内容的话不是应该要取值吗,不应该是用 *p[j] 来表示取值吗?
        {
            printf("%c", (*p)[j]);               //既然是指针,打印的话不应该是*(*p)[j]吗?
        }
        printf("\n");
    }
   
    return 0;
}
最佳答案
2019-3-28 21:37:51
(*p)[5] 数组指针,是一个指针,它指向了一个数组 它本来正常指向的是array[5]
(*p)[0] = "FishC"
(*p)[1] = "Five"
因为它里面是字符串不是字符所以不能这样访问,所以还得通过指针来访问。

但本题中*array[5]  指针数组 也是数组,但是它里面存放的都是指针变量,"FishC", "Five", "Star", "Good", "WoW" 这些都是把字符串的地址存放到 *array[5] 中。
数组里面都是指针,那怎么访问里面的内容呢?
平常
int a = 5;
int *p = &a; // &a 就是地址,如果用指针的方式来获取a处的内容 就得用 *p 来操作了

*(*p)[5] 就是用指针的形式指向数组中"FishC", "Five", "Star", "Good", "WoW" 的地址。就好比
*(*p)[0] = "FishC"的地址
*(*p)[1] = "Five"的地址

好了*(*p)[5]再来看它的优先级
() 最高 (*p)
[] 其次 [5]
* 最后
所以这里先是一个数组指针(*p)[5]然后再是 *一个指针来指向数组里的每一项。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-28 21:37:51 | 显示全部楼层    本楼为最佳答案   
(*p)[5] 数组指针,是一个指针,它指向了一个数组 它本来正常指向的是array[5]
(*p)[0] = "FishC"
(*p)[1] = "Five"
因为它里面是字符串不是字符所以不能这样访问,所以还得通过指针来访问。

但本题中*array[5]  指针数组 也是数组,但是它里面存放的都是指针变量,"FishC", "Five", "Star", "Good", "WoW" 这些都是把字符串的地址存放到 *array[5] 中。
数组里面都是指针,那怎么访问里面的内容呢?
平常
int a = 5;
int *p = &a; // &a 就是地址,如果用指针的方式来获取a处的内容 就得用 *p 来操作了

*(*p)[5] 就是用指针的形式指向数组中"FishC", "Five", "Star", "Good", "WoW" 的地址。就好比
*(*p)[0] = "FishC"的地址
*(*p)[1] = "Five"的地址

好了*(*p)[5]再来看它的优先级
() 最高 (*p)
[] 其次 [5]
* 最后
所以这里先是一个数组指针(*p)[5]然后再是 *一个指针来指向数组里的每一项。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-29 00:24:10 | 显示全部楼层
ba21 发表于 2019-3-28 21:37
(*p)[5] 数组指针,是一个指针,它指向了一个数组 它本来正常指向的是array[5]
(*p)[0] = "FishC"
(*p)[1 ...

我这么理解正确吗?
首先,array是一个指针数组,可以通过数组的下标来索引5个元素,这5个元素都是指针。这5个指针都是字符串型指针,本来可以直接通过 printf("s", array[n])来输出。
如果是字符型的话,printf("c", *array[n]) 或者 printf("c", array[n]) 都可以输出。

这个题目的要求是小甲鱼来帮助我们理解,所以不用上述的方式来输出

现在,数组指针是一个指向数组的指针。这里是小甲鱼引导我们用指针来输出。现在(*p)[n]是在索引array下标为n的元素,因为这个元素是一个地址,所以直接对(*p)[n]用取值符号的话
*(*p)[n]取的是地址,到这里我是这样理解的

但是用char *(*p)[5] = &array;感觉是用一个*和    *array[5]的*给抵消了,但仍然感觉很抽象,想不通。

最后输出的时候不用*来取值是应为a[j]是一个数组,不需要*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-29 19:13:25 | 显示全部楼层
六一九 发表于 2019-3-29 00:24
我这么理解正确吗?
首先,array是一个指针数组,可以通过数组的下标来索引5个元素,这5个元素都是指针 ...

如果是字符型的话 没必要用指针数组来存指针,用数组来存字符就行了吧。正因为字符串的特殊性(字符串其它就是一个带'\0'的字符 数组),C也不存在字符串一说,这里也只是假如说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 08:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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