六一九 发表于 2019-3-28 18:51:35

第23课的动手第1题答案没理解

#include <stdio.h>

int main()
{
    char *array = {"FishC", "Five", "Star", "Good", "WoW"};                     // 定义一个指针数组
    char *(*p) = &array;                        // (*p)是数组指针,为什么前面还要再加一个*?
    int i, j;
         
    for (i = 0; i < 5; i++)
    {
      for (j = 0; (*p) != '\0'; j++)                   // 这里(*p)如果是指内容的话不是应该要取值吗,不应该是用 *p 来表示取值吗?
      {
            printf("%c", (*p));               //既然是指针,打印的话不应该是*(*p)吗?
      }
      printf("\n");
    }
   
    return 0;
}

ba21 发表于 2019-3-28 21:37:51

(*p) 数组指针,是一个指针,它指向了一个数组 它本来正常指向的是array
(*p) = "FishC"
(*p) = "Five"
因为它里面是字符串不是字符所以不能这样访问,所以还得通过指针来访问。

但本题中*array指针数组 也是数组,但是它里面存放的都是指针变量,"FishC", "Five", "Star", "Good", "WoW" 这些都是把字符串的地址存放到 *array 中。
数组里面都是指针,那怎么访问里面的内容呢?
平常
int a = 5;
int *p = &a; // &a 就是地址,如果用指针的方式来获取a处的内容 就得用 *p 来操作了

*(*p) 就是用指针的形式指向数组中"FishC", "Five", "Star", "Good", "WoW" 的地址。就好比
*(*p) = "FishC"的地址
*(*p) = "Five"的地址

好了*(*p)再来看它的优先级
() 最高 (*p)
[] 其次
* 最后
所以这里先是一个数组指针(*p)然后再是 *一个指针来指向数组里的每一项。

六一九 发表于 2019-3-29 00:24:10

ba21 发表于 2019-3-28 21:37
(*p) 数组指针,是一个指针,它指向了一个数组 它本来正常指向的是array
(*p) = "FishC"
(*p)

我这么理解正确吗?
首先,array是一个指针数组,可以通过数组的下标来索引5个元素,这5个元素都是指针。这5个指针都是字符串型指针,本来可以直接通过 printf("s", array)来输出。
如果是字符型的话,printf("c", *array) 或者 printf("c", array) 都可以输出。

这个题目的要求是小甲鱼来帮助我们理解,所以不用上述的方式来输出

现在,数组指针是一个指向数组的指针。这里是小甲鱼引导我们用指针来输出。现在(*p)是在索引array下标为n的元素,因为这个元素是一个地址,所以直接对(*p)用取值符号的话
*(*p)取的是地址,到这里我是这样理解的

但是用char *(*p) = &array;感觉是用一个*和    *array的*给抵消了,但仍然感觉很抽象,想不通。

最后输出的时候不用*来取值是应为a是一个数组,不需要*

ba21 发表于 2019-3-29 19:13:25

六一九 发表于 2019-3-29 00:24
我这么理解正确吗?
首先,array是一个指针数组,可以通过数组的下标来索引5个元素,这5个元素都是指针 ...

如果是字符型的话 没必要用指针数组来存指针,用数组来存字符就行了吧。正因为字符串的特殊性(字符串其它就是一个带'\0'的字符 数组),C也不存在字符串一说,这里也只是假如说
页: [1]
查看完整版本: 第23课的动手第1题答案没理解