鱼C论坛

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

[已解决]C语言 指针数组和数组指针01

[复制链接]
发表于 2024-3-19 10:02:59 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 liyifeng295641 于 2024-3-19 15:06 编辑
#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;
}

@FishC,这串代码中,第五行中为什么不是array[5]而是*array[5]。
最佳答案
2024-3-19 10:05:12
liyifeng295641 发表于 2024-03-19 10:04
我还是不是很理解!


没问题,我再给你解释一下。

在C语言中,数组名实际上是指向数组第一个元素的指针,因此在定义字符数组时,可以将其赋值给一个字符指针。例如,char *array = {"FishC", "Five", "Star", "Good", "WoW"}; 这里,`array`被赋值为指向第一个字符串字面量"FishC"的指针。

但是,在这段代码中,我们需要处理多个字符串,所以我们需要一个指向指针的指针。我们使用`char **p`来声明一个指向字符指针的指针变量。

然后,我们将`array`的地址赋值给`p`,也就是`p`指向了`array`的首地址。

在循环中,我们通过`*(*p + j)`来访问字符串中的每个字符。让我们来分解一下这行代码:

- `*p`:首先,`*p`表示取出`p`所指向的指针,也就是`array`的地址。
- `*(*p + j)`:接下来,我们加上`j`作为偏移量,这样就可以访问到字符串中的每个字符。

希望这次解释能够更清楚地帮助你理解指针数组和数组指针的概念。如果还有其他问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-19 10:03:17 | 显示全部楼层
这是因为在C语言中,字符串字面量(如"FishC")是一个字符数组,而不是一个指针。

当你使用
char *array = {"FishC", "Five", "Star", "Good", "WoW"};

时,编译器会发出警告,因为你试图将一个字符串字面量的数组赋值给一个字符指针。正确的做法是使用一个二维字符数组来存储多个字符串:
char array[][20] = {"FishC", "Five", "Star", "Good", "WoW"};

这样,`array`就成为一个由5个字符串组成的数组。

接下来,我们需要定义一个指向字符指针的指针`p`,它可以指向`array`中的任意一个字符串。我们可以这样定义:
char **p = array;

这样,`p`就指向了`array`的首地址。

然后,在循环中,我们可以通过`*(*p + j)`来访问`array`中的每个字符。所以完整的代码如下所示:
#include <stdio.h>

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

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

    return 0;
}

此代码将输出:
F i s h C 
F i v e 
S t a r 
G o o d 
W o W

希望这个解释能够帮助你理解为什么要使用`*(*p + j)`来访问数组中的字符。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 10:04:58 | 显示全部楼层
FishC 发表于 2024-3-19 10:03
这是因为在C语言中,字符串字面量(如"FishC")是一个字符数组,而不是一个指针。

当你使用

我还是不是很理解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 10:05:12 | 显示全部楼层    本楼为最佳答案   
liyifeng295641 发表于 2024-03-19 10:04
我还是不是很理解!


没问题,我再给你解释一下。

在C语言中,数组名实际上是指向数组第一个元素的指针,因此在定义字符数组时,可以将其赋值给一个字符指针。例如,char *array = {"FishC", "Five", "Star", "Good", "WoW"}; 这里,`array`被赋值为指向第一个字符串字面量"FishC"的指针。

但是,在这段代码中,我们需要处理多个字符串,所以我们需要一个指向指针的指针。我们使用`char **p`来声明一个指向字符指针的指针变量。

然后,我们将`array`的地址赋值给`p`,也就是`p`指向了`array`的首地址。

在循环中,我们通过`*(*p + j)`来访问字符串中的每个字符。让我们来分解一下这行代码:

- `*p`:首先,`*p`表示取出`p`所指向的指针,也就是`array`的地址。
- `*(*p + j)`:接下来,我们加上`j`作为偏移量,这样就可以访问到字符串中的每个字符。

希望这次解释能够更清楚地帮助你理解指针数组和数组指针的概念。如果还有其他问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 13:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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