BaysideLizard 发表于 2023-10-17 11:50:54

求助指针数组 和 取值符“*”的问题

本帖最后由 BaysideLizard 于 2023-10-17 11:52 编辑

    int a=1,b=2,c=3,d=4,e=5,i;
    int *p1 = {&a,&b,&c,&d,&e};

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

    char *p2 = {"C","Java","PHP","C++","Python"};

    for (i = 0;i < 5;i++)
    {
      printf("%s ", p2);    //这里有问题
    }
问题2:为什么字符指针数组这里p2前不用加取值符*?

isdkz 发表于 2023-10-17 11:51:00

问题1:p1 是一个指针数组,其中的元素是指向 int 类型的指针。也就是说,p1 的类型是 int*[],即指向 int 类型指针的数组。

问题2:在字符指针数组中,每个元素本身就是一个指向字符的指针,所以在使用时不需要加取值符*。直接使用 p2[ i] 就可以获取到指向的字符串。

陶远航 发表于 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
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-17 11:52:42

问题1:

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

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

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

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

问题2:

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

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

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

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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 求助指针数组 和 取值符“*”的问题