|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码如下,这个本来是一道课后题,用二维指针数组的方法我可以做出来,但是想知道如果只能通过下面的方法,应该如何才能正确输出?
我编译的时候一直提示我14行的位置:warning: initialization from incompatible pointer type
我这里定义的p是 (存放(存放(字符类型指针)的数组)的数组,感觉应该没什么问题啊...但是输出却是乱码...
不太能理解,麻烦大家帮忙看看。
- #include <stdio.h>
- void main()
- {
- char *line1[5] = {"########","####"," ###### ","## ##"," ###### "};
- char *line2[5] = {"## "," ## ","## ##","## ##","## ##"};
- char *line3[5] = {"## "," ## ","## ","## ##","## "};
- char *line4[5] = {"###### "," ## "," ###### ","#########","## "};
- char *line5[5] = {"## "," ## "," ##","## ##","## "};
- char *line6[5] = {"## "," ## ","## ##","## ##","## ##"};
- char *line7[5] = {"## ","####"," ###### ","## ##"," ###### "};
-
- char *(p[7])[5] = {line1,line2,line3,line4,line5,line6,line7};
- printf("%s",p[0][0]);
- }
-
复制代码
本帖最后由 Croper 于 2019-5-14 23:15 编辑
您说的p[0][0]是指针的地址我能理解,把他解引用不就是指针变量存放的地址吗
不是,
比如说这里有一堆数据
46 69 73 68 63 00 00 00
然后有一个指针指向第一个字节,然后对这个指针解引用,你会得到什么?
结果是:无法确定
因为这要视指针类型而定,
如果这是一个char* 指针,那么得到的值为0x46(F)
如果这是一个int* 指针,那么得到的值为0x68736946
如果这是一个long long*指针,那么得到的值为0x0000006368736946
如果这是一个char**指针,那么得到的值也为0x68736946,然后程序会把这个值看成一个地址,你可以继续对这个地址解引用
再说回来,你写出类似于printf("%s",*p[0][0]);这个语句时,这里隐藏了一个类型转换,写全是这样,printf("%s",(char*)*p[0][0]);
于是,你就把一个一个指针的最后一个字节前面扩充0的值当成了指针原来的值,最后当然没法得到你想要的结果
|
|