鱼C论坛

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

数组指针和指针数组分不清,请解释下下面的代码

[复制链接]
发表于 2018-8-24 21:48:49 | 显示全部楼层 |阅读模式

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

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

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;
}
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-24 21:58:35 | 显示全部楼层
数组指针是指有一个指针,它指向一个数组的地址,也就是(指向)数组的指针;指针数组是有一个数组,它里面每个对象(元素)存放的都是指针,也就是(存放)指针的数组。其实中间加个“的”字就好辨认多了。
在你的代码中,第五行是指针(的)数组,第六行是数组(的)指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 22:48:31 | 显示全部楼层
数组指针 : 后缀 指针 那么它就是一个指针,指向数组的指针。
指针数组  : 后缀 数组  那么它就是数组, 数组里面存放的指针变量。

先牢记这2条,至于其它的慢慢也就会搞懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-8-24 22:56:40 | 显示全部楼层
本帖最后由 claws0n 于 2018-8-24 22:58 编辑

这个还算基础的数组指针与指针数组。理解的方式也不止是一种而已,先看看这个
【情况一】
int a = 3;  int *p = &a;    // 只看等号左边,int a,所以 a 是整型;int *p,所以 *p 也是整型。这里其实应该分开来看
*p 是整型,但 p = &a,p 所赋予的值是 a 的地址,所以 p 是指针。
【情况二】
如果不是基本数据类型的话,变量名称为该变量存储资料的首地址
char array[5] = {...};    array == &array[0]
【情况三】
将你给的数组例子与我的变量例子比较一下
char *array[5] == (char *) array[5]          // 这是一个数组,但存储的内容是地址   ==> 指针数组
char *(*p)[5] == (char *) (*p)[5]             // (*p) 应该跟 array 一样是个指针数组,但多了一个 * ==> 指针数组的指针

因为是指针,要找到真正对应的值,必须【解引用】也就是星号 *。例如 a = 3; p = &a; 那么 *p == 3。在【代码一】,因为 *(*p)[5] 是指针,所以在 13 行的 printf() 时,要多一个解引用的星号。
首先,*p是一个指针,指向【指针数组】,所以它存储的值是数组首元素的地址(它指向数组的首元素 “FishC”)。一开始 i = 0 >> (*p + i) == (*p + 0) == (*p) 就说明指针没有偏移,还是指向首元素。由于它是指向指针的指针,所以*(*p) 才是真正 “FishC” 的地址。"FishC" 是一个字符串,所以指针也只会指向首元素地址 'F'。+ j 表示偏移量。因为目前还是指针,所以必须解引用   *(*(*p + i) + j)) == 'F' 。

这个例子也太折腾初学者了~好多时候自己也会一脸懵逼~

【代码二】是一样的,是告诉你指针跟数组的关系,其实它们就是一样的东西。
但是请注意:不要说因为它们一样,所以用指针直接当作变量!会搞死人

总结:注意优先级,括号的优先级最高。慢慢一层一层分析就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-30 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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