鱼C论坛

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

[已解决]求助指针数组 和 取值符“*”的问题

[复制链接]
发表于 2023-10-17 11:50:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 BaysideLizard 于 2023-10-17 11:52 编辑
    int a=1,b=2,c=3,d=4,e=5,i;
    int *p1[5] = {&a,&b,&c,&d,&e};

    for (i = 0;i < 5;i++)
    {
        printf("%d ",*p1[i]);
    }
问题1:我知道 p1 是一个指针数组,但是这个int是指指针的类型还是数组的类型?
    char *p2[5] = {"C","Java","PHP","C++","Python"};

    for (i = 0;i < 5;i++)
    {
        printf("%s ", p2[i]);    //这里有问题
    }
问题2:为什么字符指针数组这里p2[i]前不用加取值符*?
最佳答案
2023-10-17 11:52:42
问题1:

p1是一个指针数组,每个元素都是int类型的指针。可以将p1视为一个数组,其中每个元素都存储了int类型变量的地址。

在代码中,p1的声明为int *p1[5],表示p1是一个包含5个元素的数组,每个元素的类型是int指针(int*)。

通过初始化语句{&a,&b,&c,&d,&e},将a、b、c、d、e的地址分别存储到了p1的五个元素中。因此,p1[0]指向a的地址,p1[1]指向b的地址,依此类推。

在循环中,通过解引用符号*p1[i],可以取得p1[i]指向的地址对应的值(即a、b、c、d、e的值),然后通过printf函数打印出来。

问题2:

p2是一个字符指针数组,每个元素都是指向字符的指针。可以将p2视为一个数组,其中每个元素都存储了指向字符串常量的指针。

在代码中,p2的声明为char *p2[5],表示p2是包含5个元素的数组,每个元素的类型是char指针(char*)。

通过初始化语句{"C","Java","PHP","C++","Python"},将五个字符串常量的首地址分别存储到了p2的五个元素中。

在循环中,通过p2[i]直接获取到指向字符串常量的指针,而不需要使用解引用符号。因为字符串常量本身就是一个指向字符的地址,所以直接打印p2[i]会输出该字符串常量。

综上所述,字符指针数组中的每个元素存储了一个字符串常量的地址,而不同于普通的变量。因此,在输出字符指针数组时不需要使用解引用符号。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-17 11:51:00 | 显示全部楼层
问题1:p1 是一个指针数组,其中的元素是指向 int 类型的指针。也就是说,p1 的类型是 int*[],即指向 int 类型指针的数组。

问题2:在字符指针数组中,每个元素本身就是一个指向字符的指针,所以在使用时不需要加取值符*。直接使用 p2[ i] 就可以获取到指向的字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-17 11:51:25 | 显示全部楼层
问题1:在 int *p1 这个声明中,int 是指针所指向的数据的类型,而 *p1 是一个指针数组。所以,int *p1 可以理解为一个包含5个元素的指针数组,这些指针都指向 int 类型的数据。

问题2:在 char *p2 这个声明中,char * 是指针的类型,它指向 char 类型的数据。在这个例子中,每个指针指向一个字符串(字符串在C语言中是由字符组成的数组,以 '\\0' 结尾)。在 printf(\"%s \", p2[ i]); 这行代码中,p2[ i] 是一个指针,它指向一个字符串。printf 函数的 %s 格式说明符期望一个指向字符串的指针作为参数。所以,这里不需要使用取值符 *。如果你使用 *p2[ i],那么你将得到的是字符串的第一个字符,因为 * 是解引用操作符,它返回指针所指向的值。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-17 11:52:42 | 显示全部楼层    本楼为最佳答案   
问题1:

p1是一个指针数组,每个元素都是int类型的指针。可以将p1视为一个数组,其中每个元素都存储了int类型变量的地址。

在代码中,p1的声明为int *p1[5],表示p1是一个包含5个元素的数组,每个元素的类型是int指针(int*)。

通过初始化语句{&a,&b,&c,&d,&e},将a、b、c、d、e的地址分别存储到了p1的五个元素中。因此,p1[0]指向a的地址,p1[1]指向b的地址,依此类推。

在循环中,通过解引用符号*p1[i],可以取得p1[i]指向的地址对应的值(即a、b、c、d、e的值),然后通过printf函数打印出来。

问题2:

p2是一个字符指针数组,每个元素都是指向字符的指针。可以将p2视为一个数组,其中每个元素都存储了指向字符串常量的指针。

在代码中,p2的声明为char *p2[5],表示p2是包含5个元素的数组,每个元素的类型是char指针(char*)。

通过初始化语句{"C","Java","PHP","C++","Python"},将五个字符串常量的首地址分别存储到了p2的五个元素中。

在循环中,通过p2[i]直接获取到指向字符串常量的指针,而不需要使用解引用符号。因为字符串常量本身就是一个指向字符的地址,所以直接打印p2[i]会输出该字符串常量。

综上所述,字符指针数组中的每个元素存储了一个字符串常量的地址,而不同于普通的变量。因此,在输出字符指针数组时不需要使用解引用符号。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 21:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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