C语言 指针数组和数组指针01
本帖最后由 liyifeng295641 于 2024-3-19 15:06 编辑#include <stdio.h>
int main()
{
char *array = {"FishC", "Five", "Star", "Good", "WoW"};
char *(*p) = &array;
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; (*p) != '\0'; j++)
{
printf("%c ", (*p));
}
printf("\n");
}
return 0;
}
@FishC,这串代码中,第五行中为什么不是array而是*array。 这是因为在C语言中,字符串字面量(如"FishC")是一个字符数组,而不是一个指针。
当你使用
char *array = {"FishC", "Five", "Star", "Good", "WoW"};
时,编译器会发出警告,因为你试图将一个字符串字面量的数组赋值给一个字符指针。正确的做法是使用一个二维字符数组来存储多个字符串:
char array[] = {"FishC", "Five", "Star", "Good", "WoW"};
这样,`array`就成为一个由5个字符串组成的数组。
接下来,我们需要定义一个指向字符指针的指针`p`,它可以指向`array`中的任意一个字符串。我们可以这样定义:
char **p = array;
这样,`p`就指向了`array`的首地址。
然后,在循环中,我们可以通过`*(*p + j)`来访问`array`中的每个字符。所以完整的代码如下所示:
#include <stdio.h>
int main()
{
char array[] = {"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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-3-19 10:03
这是因为在C语言中,字符串字面量(如"FishC")是一个字符数组,而不是一个指针。
当你使用
我还是不是很理解! 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 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]