关于指针: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 {:10_282:} 怎么搞这玩意?
char ch; // 单一字符
char str; // 三个字符一组(先这样看)
char *p; // p 是一个指向单一字符的指针
char (*p); // p 是一个指向【三个字符一组】的指针 => 数组(的)指针。你的代码用下标,看不出它好玩的地方。
至于 str 前面的是强制转型。因为 p 的跨度是 3,而 str 的跨度是 1。 claws0n 发表于 2018-9-5 19:24
怎么搞这玩意?
char ch; // 单一字符
char str; // 三个字符一组(先这样看)
意思是说我的str的跨度强制变成了3跨度,那是指行数变成了3,还是列数。? 彭尼玛 发表于 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;
} claws0n 发表于 2018-9-5 19:58
不是,str 的结构并没有改变。因为 p 要指向 str 才可以打印 str 的内容,但是如果没有强制转型,不能够 ...
那为什么(*)str星号这边必须有个括号(),不加括号好像就是个指针数组了吗?
哦,难道就是为了配合数组指针是吧?把str匹配成数组指针的形式,让指针P可以接收到_(:з」∠)_ 彭尼玛 发表于 2018-9-5 20:17
那为什么(*)str星号这边必须有个括号(),不加括号好像就是个指针数组了吗?
哦,难道就是为了配 ...
括号的优先级较高,所以必须 (*),两个括号在一起,优先级从做开始,才能确保 p 是一个指针。对不加括号是 (char *) p,是一个装有 3 个指针的数组。
是的,float a = int b; 可以编译,但是会提出警告,所以强制转型,匹配数据类型。至于让 p 是一个数组指针,在这里的优势显明。 claws0n 发表于 2018-9-5 20:44
括号的优先级较高,所以必须 (*),两个括号在一起,优先级从做开始,才能确保 p 是一个指针。对不加括 ...
明白了_(:з」∠)_谢谢 彭尼玛 发表于 2018-9-6 11:22
明白了_(:з」∠)_谢谢
记得采纳最佳答案哦~{:10_254:}
页:
[1]