鱼C论坛

 找回密码
 立即注册
查看: 1263|回复: 11

[已解决]数组指针‘’

[复制链接]
发表于 2020-12-14 14:39:38 | 显示全部楼层 |阅读模式

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

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

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

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


而正确的是:
  1. *(*(*p + i) + j)
复制代码

这里为什么要先
*p 呢
有人嘛嘛,帮帮我



完整程序如下:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
  5.         char *(*p)[5] = &array;
  6.         int i, j;

  7.         for (i = 0; i < 5; i++)
  8.         {
  9.                 for (j = 0; *(*(*p + i) + j) != '\0'; j++)
  10.                 {
  11.                         printf("%c ", *(*(*p + i) + j));
  12.                 }
  13.                 printf("\n");
  14.         }

  15.         return 0;
  16. }
复制代码
最佳答案
2020-12-14 16:18:10
本帖最后由 风过无痕1989 于 2020-12-14 16:20 编辑
万千只cnm 发表于 2020-12-14 15:28
@风过无痕1989  大佬在嘛


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

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

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

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

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

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


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char array[5][6] = { "FishC", "Five", "Star", "Good", "WoW" };
  5.     char (*p)[6] = array;
  6.     int i, j;

  7.     for (i = 0; i < 5; i++)
  8.     {
  9.         for (j = 0; *(*(p + i) + j) != '\0'; j++)
  10.         {
  11.             printf("%c ", *(*(p + i) + j));
  12.         }
  13.         printf("\n");
  14.     }

  15.     return 0;
  16. }
复制代码

为了方便比较,我还是将上面的例子移下来:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
  5.         char *(*p)[5] = &array;
  6.         int i, j;

  7.         for (i = 0; i < 5; i++)
  8.         {
  9.                 for (j = 0; *(*(*p + i) + j) != '\0'; j++)
  10.                 {
  11.                         printf("%c ", *(*(*p + i) + j));
  12.                 }
  13.                 printf("\n");
  14.         }

  15.         return 0;
  16. }
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-14 14:40:15 | 显示全部楼层
助けてください 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 14:50:58 | 显示全部楼层
你那里想错了吧,数组指针,实际上是指向数组类型的指针,既然是指针所以那里面应该是先*p
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 15:26:18 | 显示全部楼层
严凯 发表于 2020-12-14 14:50
你那里想错了吧,数组指针,实际上是指向数组类型的指针,既然是指针所以那里面应该是先*p

那为什么指向一般数组取值是
*(*(p+i)+j)呢
而不是
*(*p+i)+j
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 15:28:20 | 显示全部楼层
@风过无痕1989  大佬在嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

*(*p+i)+j,就意味着这个指针的值加j
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 16:18:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-12-14 16:20 编辑
万千只cnm 发表于 2020-12-14 15:28
@风过无痕1989  大佬在嘛


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

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

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

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

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

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


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char array[5][6] = { "FishC", "Five", "Star", "Good", "WoW" };
  5.     char (*p)[6] = array;
  6.     int i, j;

  7.     for (i = 0; i < 5; i++)
  8.     {
  9.         for (j = 0; *(*(p + i) + j) != '\0'; j++)
  10.         {
  11.             printf("%c ", *(*(p + i) + j));
  12.         }
  13.         printf("\n");
  14.     }

  15.     return 0;
  16. }
复制代码

为了方便比较,我还是将上面的例子移下来:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
  5.         char *(*p)[5] = &array;
  6.         int i, j;

  7.         for (i = 0; i < 5; i++)
  8.         {
  9.                 for (j = 0; *(*(*p + i) + j) != '\0'; j++)
  10.                 {
  11.                         printf("%c ", *(*(*p + i) + j));
  12.                 }
  13.                 printf("\n");
  14.         }

  15.         return 0;
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 21:44:11 | 显示全部楼层
风过无痕1989 发表于 2020-12-14 16:18
对指针数组和数组指针的区别,示例代码如下所示:

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

谢谢这么用心
那这里面最里面的(*p)有具体含义嘛
还是只是因为指向的是指针数组,单纯的加个*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不能说单纯地加个 *,是因为是那么定义的,它才有个 *。只要你别忘记 *array 定义的是一个指针数组,你就可以将它当作是一个数组的数组名看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请问那
  1. char array[5][6] = { "FishC", "Five", "Star", "Good", "WoW" };
  2.    [code] char (*p)[6] =&array;
复制代码


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

char (*p)[6] = &array;[/code]
[/code]
这样为什么也能打印出来呢但会提醒

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 00:26:56 | 显示全部楼层

我的 VS2015 编译器输出不了,提示错误:
错误(活动)                "char (*)[5][6]" 类型的值不能用于初始化 "char (*)[6]" 类型的实体
错误        C2440        “初始化”: 无法从“char (*)[5][6]”转换为“char (*)[6]”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-30 18:58:17 | 显示全部楼层
万千只cnm 发表于 2020-12-14 15:26
那为什么指向一般数组取值是
*(*(p+i)+j)呢
而不是

一种是取行的值 一种是取列的值 怎么能一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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