鱼C论坛

 找回密码
 立即注册
查看: 3932|回复: 7

[已解决]关于指针:char(*p)[3] = (char (*)[3])str 不理解~求助

[复制链接]
发表于 2018-9-5 19:13:48 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
int main(void)
{
        char str[10];
        scanf_s("%s", str,10);
        char(*p)[3] = (char (*)[3])str;
        for (int j = 0; j < 3; j++)
        {
                for (int i = 0; i < 3; i++)
                        printf("%c ", p[j][i]);
                printf("\n");
        }
        return 0;
}

其中的   char(*p)[3] = (char (*)[3])str;  这一段,这个char(*)[3]str 所表示的意义是什么?
为什么会有这样的操作?把str变成二维数组??中间*号旁边的括号可以去掉吗??

求助_(:з」∠)_QAQ
最佳答案
2018-9-5 19:58:59
彭尼玛 发表于 2018-9-5 19:48
意思是说我的str的跨度强制变成了3跨度,那是指行数变成了3,还是列数。?

不是,str 的结构并没有改变。因为 p 要指向 str 才可以打印 str 的内容,但是如果没有强制转型,不能够用下标。那个强制转型只不过是为了匹配数据类型。这里要注意的是【a = b】其实是把 b 拷贝给 a。所以 (*p)[3] 得到的是一个副本,不影响原有的 str
如果不要把 p 变成跨度为 3,会比较难看
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         char str[10];
  5.         scanf_s("%s", str,10);
  6. //        char(*p)[3] = (char (*)[3])str;
  7.                 char *p = str;
  8.         for (int j = 0; j < 9; j += 3)
  9.         {
  10.                 for (int i = 0; i < 3; i++)
  11.                         printf("%c ", *(p+i+j));
  12.                 printf("\n");
  13.         }
  14.         return 0;
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-5 19:24:37 | 显示全部楼层
怎么搞这玩意?
char ch;        // 单一字符
char str[3];   // 三个字符一组(先这样看)
char *p;       // p 是一个指向单一字符的指针
char (*p)[3];   // p 是一个指向【三个字符一组】的指针 => 数组(的)指针。你的代码用下标,看不出它好玩的地方。

至于 str 前面的是强制转型。因为 p 的跨度是 3,而 str 的跨度是 1。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-5 19:48:53 | 显示全部楼层
claws0n 发表于 2018-9-5 19:24
怎么搞这玩意?
char ch;        // 单一字符
char str[3];   // 三个字符一组(先这样看)

意思是说我的str的跨度强制变成了3跨度,那是指行数变成了3,还是列数。?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 19:58:59 | 显示全部楼层    本楼为最佳答案   
彭尼玛 发表于 2018-9-5 19:48
意思是说我的str的跨度强制变成了3跨度,那是指行数变成了3,还是列数。?

不是,str 的结构并没有改变。因为 p 要指向 str 才可以打印 str 的内容,但是如果没有强制转型,不能够用下标。那个强制转型只不过是为了匹配数据类型。这里要注意的是【a = b】其实是把 b 拷贝给 a。所以 (*p)[3] 得到的是一个副本,不影响原有的 str
如果不要把 p 变成跨度为 3,会比较难看
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         char str[10];
  5.         scanf_s("%s", str,10);
  6. //        char(*p)[3] = (char (*)[3])str;
  7.                 char *p = str;
  8.         for (int j = 0; j < 9; j += 3)
  9.         {
  10.                 for (int i = 0; i < 3; i++)
  11.                         printf("%c ", *(p+i+j));
  12.                 printf("\n");
  13.         }
  14.         return 0;
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-5 20:17:54 | 显示全部楼层
claws0n 发表于 2018-9-5 19:58
不是,str 的结构并没有改变。因为 p 要指向 str 才可以打印 str 的内容,但是如果没有强制转型,不能够 ...

那为什么(*)[3]str  星号这边必须有个括号(),不加括号好像就是个指针数组了吗?
哦,难道就是为了配合数组指针是吧?把str匹配成数组指针的形式,让指针P可以接收到_(:з」∠)_
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 20:44:22 | 显示全部楼层
彭尼玛 发表于 2018-9-5 20:17
那为什么(*)[3]str  星号这边必须有个括号(),不加括号好像就是个指针数组了吗?
哦,难道就是为了配 ...

括号的优先级较高,所以必须 (*)[3],两个括号在一起,优先级从做开始,才能确保 p 是一个指针。对不加括号是 (char *) p[3],是一个装有 3 个指针的数组。
是的,float a = int b; 可以编译,但是会提出警告,所以强制转型,匹配数据类型。至于让 p 是一个数组指针,在这里的优势显明。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-6 11:22:56 | 显示全部楼层
claws0n 发表于 2018-9-5 20:44
括号的优先级较高,所以必须 (*)[3],两个括号在一起,优先级从做开始,才能确保 p 是一个指针。对不加括 ...

明白了_(:з」∠)_谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-6 11:30:36 | 显示全部楼层
彭尼玛 发表于 2018-9-6 11:22
明白了_(:з」∠)_谢谢

记得采纳最佳答案哦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-5 03:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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