彭尼玛 发表于 2018-9-5 19:13:48

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

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

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

求助_(:з」∠)_QAQ

claws0n 发表于 2018-9-5 19:24:37

{:10_282:} 怎么搞这玩意?
char ch;      // 单一字符
char str;   // 三个字符一组(先这样看)
char *p;       // p 是一个指向单一字符的指针
char (*p);   // p 是一个指向【三个字符一组】的指针 => 数组(的)指针。你的代码用下标,看不出它好玩的地方。

至于 str 前面的是强制转型。因为 p 的跨度是 3,而 str 的跨度是 1。

彭尼玛 发表于 2018-9-5 19:48:53

claws0n 发表于 2018-9-5 19:24
怎么搞这玩意?
char ch;      // 单一字符
char str;   // 三个字符一组(先这样看)


意思是说我的str的跨度强制变成了3跨度,那是指行数变成了3,还是列数。?

claws0n 发表于 2018-9-5 19:58:59

彭尼玛 发表于 2018-9-5 19:48
意思是说我的str的跨度强制变成了3跨度,那是指行数变成了3,还是列数。?

不是,str 的结构并没有改变。因为 p 要指向 str 才可以打印 str 的内容,但是如果没有强制转型,不能够用下标。那个强制转型只不过是为了匹配数据类型。这里要注意的是【a = b】其实是把 b 拷贝给 a。所以 (*p) 得到的是一个副本,不影响原有的 str
如果不要把 p 变成跨度为 3,会比较难看
#include<stdio.h>
int main(void)
{
      char str;
      scanf_s("%s", str,10);
//      char(*p) = (char (*))str;
                char *p = str;
      for (int j = 0; j < 9; j += 3)
      {
                for (int i = 0; i < 3; i++)
                        printf("%c ", *(p+i+j));
                printf("\n");
      }
      return 0;
}

彭尼玛 发表于 2018-9-5 20:17:54

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

那为什么(*)str星号这边必须有个括号(),不加括号好像就是个指针数组了吗?
哦,难道就是为了配合数组指针是吧?把str匹配成数组指针的形式,让指针P可以接收到_(:з」∠)_

claws0n 发表于 2018-9-5 20:44:22

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

括号的优先级较高,所以必须 (*),两个括号在一起,优先级从做开始,才能确保 p 是一个指针。对不加括号是 (char *) p,是一个装有 3 个指针的数组。
是的,float a = int b; 可以编译,但是会提出警告,所以强制转型,匹配数据类型。至于让 p 是一个数组指针,在这里的优势显明。

彭尼玛 发表于 2018-9-6 11:22:56

claws0n 发表于 2018-9-5 20:44
括号的优先级较高,所以必须 (*),两个括号在一起,优先级从做开始,才能确保 p 是一个指针。对不加括 ...

明白了_(:з」∠)_谢谢

claws0n 发表于 2018-9-6 11:30:36

彭尼玛 发表于 2018-9-6 11:22
明白了_(:з」∠)_谢谢

记得采纳最佳答案哦~{:10_254:}
页: [1]
查看完整版本: 关于指针:char(*p)[3] = (char (*)[3])str 不理解~求助