洛城闻笛 发表于 2018-8-24 21:48:49

数组指针和指针数组分不清,请解释下下面的代码

#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 + i) + j) != '\0'; j++)
                {
                        printf("%c ", *(*(*p + i) + j));
                }
                printf("\n");
      }

      return 0;
}


#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;
}

xhzzzloveyou 发表于 2018-8-24 21:58:35

数组指针是指有一个指针,它指向一个数组的地址,也就是(指向)数组的指针;指针数组是有一个数组,它里面每个对象(元素)存放的都是指针,也就是(存放)指针的数组。其实中间加个“的”字就好辨认多了。
在你的代码中,第五行是指针(的)数组,第六行是数组(的)指针。

ba21 发表于 2018-8-24 22:48:31

数组指针 : 后缀 指针 那么它就是一个指针,指向数组的指针。
指针数组: 后缀 数组那么它就是数组, 数组里面存放的指针变量。

先牢记这2条,至于其它的慢慢也就会搞懂。

claws0n 发表于 2018-8-24 22:56:40

本帖最后由 claws0n 于 2018-8-24 22:58 编辑

这个还算基础的数组指针与指针数组。理解的方式也不止是一种而已,先看看这个
【情况一】
int a = 3;int *p = &a;    // 只看等号左边,int a,所以 a 是整型;int *p,所以 *p 也是整型。这里其实应该分开来看
*p 是整型,但 p = &a,p 所赋予的值是 a 的地址,所以 p 是指针。
【情况二】
如果不是基本数据类型的话,变量名称为该变量存储资料的首地址
char array = {...};    array == &array
【情况三】
将你给的数组例子与我的变量例子比较一下
char *array == (char *) array          // 这是一个数组,但存储的内容是地址   ==> 指针数组
char *(*p) == (char *) (*p)             // (*p) 应该跟 array 一样是个指针数组,但多了一个 * ==> 指针数组的指针

因为是指针,要找到真正对应的值,必须【解引用】也就是星号 *。例如 a = 3; p = &a; 那么 *p == 3。在【代码一】,因为 *(*p) 是指针,所以在 13 行的 printf() 时,要多一个解引用的星号。
首先,*p是一个指针,指向【指针数组】,所以它存储的值是数组首元素的地址(它指向数组的首元素 “FishC”)。一开始 i = 0 >> (*p + i) == (*p + 0) == (*p) 就说明指针没有偏移,还是指向首元素。由于它是指向指针的指针,所以*(*p) 才是真正 “FishC” 的地址。"FishC" 是一个字符串,所以指针也只会指向首元素地址 'F'。+ j 表示偏移量。因为目前还是指针,所以必须解引用   *(*(*p + i) + j)) == 'F' 。

这个例子也太折腾初学者了~好多时候自己也会一脸懵逼~

【代码二】是一样的,是告诉你指针跟数组的关系,其实它们就是一样的东西。
但是请注意:不要说因为它们一样,所以用指针直接当作变量!会搞死人

总结:注意优先级,括号的优先级最高。慢慢一层一层分析就可以了
页: [1]
查看完整版本: 数组指针和指针数组分不清,请解释下下面的代码