鱼C论坛

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

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

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

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

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

x
本帖最后由 liyifeng295641 于 2024-3-19 15:06 编辑
  1. #include <stdio.h>

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

  7.         for (i = 0; i < 5; i++)
  8.         {
  9.                 for (j = 0; (*p)[i][j] != '\0'; j++)
  10.                 {
  11.                         printf("%c ", (*p)[i][j]);
  12.                 }
  13.                 printf("\n");
  14.         }

  15.         return 0;
  16. }
复制代码


@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")是一个字符数组,而不是一个指针。

当你使用

  1. char *array = {"FishC", "Five", "Star", "Good", "WoW"};
复制代码


时,编译器会发出警告,因为你试图将一个字符串字面量的数组赋值给一个字符指针。正确的做法是使用一个二维字符数组来存储多个字符串:

  1. char array[][20] = {"FishC", "Five", "Star", "Good", "WoW"};
复制代码


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

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

  1. char **p = array;
复制代码


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

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

  1. #include <stdio.h>

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

  7.     for (i = 0; i < 5; i++)
  8.     {
  9.         for (j = 0; *(*p + j) != '\0'; j++)
  10.         {
  11.             printf("%c ", *(*p + j));
  12.         }
  13.         printf("\n");
  14.         p++;
  15.     }

  16.     return 0;
  17. }
复制代码


此代码将输出:

  1. F i s h C
  2. F i v e
  3. S t a r
  4. G o o d
  5. 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-4-27 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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