万千只cnm 发表于 2020-12-14 14:39:38

数组指针‘’

请问:
数组指针 指向的是指针类型数组,为什么不是最外面多加一个*取址符号呢

我的理解是:跟指向int型数组一样 --> *(*(p+i)+j)-->再取一次址
-->
如下:   
*(*(*(p + i) + j))

而正确的是:
*(*(*p + i) + j)
这里为什么要先
*p 呢
有人嘛嘛,帮帮我{:5_104:}



完整程序如下:
#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;
}

万千只cnm 发表于 2020-12-14 14:40:15

助けてください 

严凯 发表于 2020-12-14 14:50:58

你那里想错了吧,数组指针,实际上是指向数组类型的指针,既然是指针所以那里面应该是先*p

万千只cnm 发表于 2020-12-14 15:26:18

严凯 发表于 2020-12-14 14:50
你那里想错了吧,数组指针,实际上是指向数组类型的指针,既然是指针所以那里面应该是先*p

那为什么指向一般数组取值是
*(*(p+i)+j)呢{:5_104:}
而不是
*(*p+i)+j

万千只cnm 发表于 2020-12-14 15:28:20

@风过无痕1989大佬在嘛{:5_104:}{:5_101:}

严凯 发表于 2020-12-14 15:32:24

万千只cnm 发表于 2020-12-14 15:26
那为什么指向一般数组取值是
*(*(p+i)+j)呢
而不是


*(*p+i)+j,就意味着这个指针的值加j

风过无痕1989 发表于 2020-12-14 16:18:10

本帖最后由 风过无痕1989 于 2020-12-14 16:20 编辑

万千只cnm 发表于 2020-12-14 15:28
@风过无痕1989大佬在嘛

对指针数组和数组指针的区别,示例代码如下所示:

int *array;   // 定义一个指针数组
int (*arr);   // 定义一个数组指针

首先,对于语句“int *array”,因为“[]”的优先级要比“*”要高,所以 array 先与“[]”结合,构成一个数组的定义,数组名为 array,而“int *”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,它是一个指针数组。

其次,对于语句“int(*arr)”,“()”的优先级比“[]”高,“*”号和 arr 构成一个指针的定义,指针变量名为 arr,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,arr 是一个指针,它指向一个包含 5 个 int 类型数据的数组,很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。

对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。

比较下面的例子,此例子与求助的程序输出结果完全相同,只是求助的程序,定义的是一个指针数组,而下面的程序定义的是一个数组指针,故而,求助的例子会多一个 * 号


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

      return 0;
}

万千只cnm 发表于 2020-12-14 21:44:11

风过无痕1989 发表于 2020-12-14 16:18
对指针数组和数组指针的区别,示例代码如下所示:

int *array;   // 定义一个指针数组


谢谢这么用心{:5_104:}
那这里面最里面的(*p)有具体含义嘛
还是只是因为指向的是指针数组,单纯的加个*

风过无痕1989 发表于 2020-12-14 22:51:47

万千只cnm 发表于 2020-12-14 21:44
谢谢这么用心
那这里面最里面的(*p)有具体含义嘛
还是只是因为指向的是指针数组,单纯的加 ...

不能说单纯地加个 *,是因为是那么定义的,它才有个 *。只要你别忘记 *array 定义的是一个指针数组,你就可以将它当作是一个数组的数组名看

万千只cnm 发表于 2020-12-15 00:03:57

风过无痕1989 发表于 2020-12-14 22:51
不能说单纯地加个 *,是因为是那么定义的,它才有个 *。只要你别忘记 *array 定义的是一个指针数组,你就 ...

请问那
char array = { "FishC", "Five", "Star", "Good", "WoW" };
    char (*p) =&array;

为什么不是,不用加%取地址符号嘛

char (*p) = &array;

这样为什么也能打印出来呢但会提醒{:5_104:}

风过无痕1989 发表于 2020-12-15 00:26:56

万千只cnm 发表于 2020-12-15 00:03
请问那




我的 VS2015 编译器输出不了,提示错误:
错误(活动)                "char (*)" 类型的值不能用于初始化 "char (*)" 类型的实体
错误        C2440        “初始化”: 无法从“char (*)”转换为“char (*)”

aj528599 发表于 2020-12-30 18:58:17

万千只cnm 发表于 2020-12-14 15:26
那为什么指向一般数组取值是
*(*(p+i)+j)呢
而不是


一种是取行的值 一种是取列的值 怎么能一样
页: [1]
查看完整版本: 数组指针‘’