关于C语言指针的问题

云端的人 发布于 2013/11/12 16:04
阅读 718
收藏 0

问大家一个问题,求教了

列一:

 int a=3;

 void **p=(void *)&a;

printf("%d\n",*p);

//*p=3;

列二:

int a=3;

int **p=(int *)&a;// 这个地方编译出现警告

printf("%d\n",*p);

上面两个例子,为什么第一个列子没有问题,第二个却有警告呢,求大神解释一下!

以下是问题补充:

@云端的人:还有补充一个问题 上面的int a=3; void **p=(void *)&a;这个是没问题的; 那么为什么我下面这样写是错误的呢 int a=3; void *p=(void)&a; 这种写法就是错误的,有点搞不明白了,求大神跟我说说 (2013/11/12 16:10)
加载中
1
echor
echor
我想开骂,不会就不要用,
云端的人
云端的人
其实现在好多东西大家都会用,但是真要认真问起来还是有人不是太明白为什么,虽然问题问的小,但的确问身边几个人没给出确切的答案的,所以我才到这里问大家的。 会用和理解不是一个概念!
0
云端的人
云端的人
补充一个问题
0
有初啊
有初啊
指针赋值就是错的语法....
云端的人
云端的人
指针赋值是错的语法吗,难道指针申明时不需要初始化吗,我不赞成
0
有初啊
有初啊
除此之外, printf 直接调用 * void_ptr 的数据没什么问题, 但是如果给 *void_ptr 赋值, 那肯定是有问题的, ----编译器不知道以何种指针类型来赋值....
云端的人
云端的人
但是第一个例子的确没问题,同样的模式,为什么例子二却无法通过,出现警告呢
0
中山野鬼
中山野鬼

(void)&a ,是将a这个存储空间的地址数据,强制转为无类型类型。而 void *p ,p里面存放的必须是指针类型。类型不同,怎么可能相同啊。

(void *)&a 是表示将a的这个存储空间的地址数据,转换成一个指针类型,无非这个指针将指向一个不知道类型的空间地址数据。其单元大小按照一个byte(8bits,不是类型,是存储位宽)来处理。

云端的人
云端的人
你回答的下面补充的问题我明白了,那为什么前面列一和列二完全一样的模式,列一没有编译和执行错误,列二却警告错误,无法编译通过!
0
中山野鬼
中山野鬼

类型不匹配是一种警告,只要不影响编译算法理解而可执行编译的,则不算停机错误。编译器不能执行下去,是你的代码无法让编译器工作,而不是这里存在逻辑问题。显示的代码存在的逻辑问题,编译器会给出警告。可以根据设置,选择不同类型的警告,以直接作为不能编译通过的条件。这个是可选择的。

再打个比方,你打算乱搞别人的老婆,这个是个警告,“这样是不对的”,你打算乱搞小兔子,这样是不可能的,所以是个错误。但如果你打算去调戏军嫂,这也是个警告,不过破坏军人家庭,你要坐牢的,老哥我只有给你的错误的判定,哈,理解了吗?

云端的人
云端的人
你这里谈到的是编译器警告问题的概念,这里面包括你说的设置等一些内容! 可是我是想弄明白,为什么同样模式的两个写法,第二种模式却出现警告无法编译通过,这里我纠结的问题不是说有警告能用不能用,改怎么设置的问题!我想知道的仅仅是实际出现两种模式出现不同结果的原因。
0
杨同学
杨同学
不会就不要用那还学个屁,不会就要搞到懂,不能说跑起来了就行了
云端的人
云端的人
我赞成! 其实现在好多东西大家都会用,但是真要认真问起来还是有人不是太明白为什么,虽然问题问的小,但的确问身边几个人没给出确切的答案的,所以我才到这里问大家的
0
修改登录密码
修改登录密码

不要写这种艰辛晦涩的代码

比方说,如果你能用二十个字的白话文说明白的,干吗非要为了节省几个字说10个字的文言文呢

lingxi27
lingxi27
回复 @云端的人 : 好好看看K&R你的这些问题都会有答案
云端的人
云端的人
不赞成求简避难的想法,对于学习者,我不是求运用的技巧,而是求问题实际出现的原因,实用和理解不是一个概念!
0
天朝搬砖工
天朝搬砖工
从某种意义来说,void*就是一种通用型,有范型的概念在里面,如果你看过stdlib.h里的函数原型就会对这个概念有所了解,所以第一个可以通过但第二个涉及到具体类型肯定报错,关于这个问题的详细讲解建议你去看看斯坦福公开课的编程范式,这个问题老外讲的很清楚
云端的人
云端的人
恩,谢谢,问了好多人,才有点眉头的!
0
中山野鬼
中山野鬼
楼主,void的类型,禁止已此类型向其他类型复制,因为他没有对应存储宽度。哈。我其实答案都告诉你了,无非具体化的内容,你自己去查资料。算了。。。。对喜欢熟条肉的,当我不存在。。。@eel 说的我是赞同的,有些东西,如果一开始没有能力深入理解原因,一开始先当条款,把工具熟练正确应用后,再考虑盘问原因,否则,就是告诉你了,你也会忘的。哈
中山野鬼
中山野鬼
回复 @云端的人 : 哈,你说我心眼小就小吧。。。好好学习天天向上。。至少我很多问题,都是自己找出来的。以前我的前辈只告诉我道理或模糊的概念,最多指条路。他们怎么对我,我怎么对后来者。
云端的人
云端的人
我感觉你这个人心眼有点小。有点知识但有点自负 其实我只是追加一下问题,想弄个明白,而且我问的又没敌意,你的度量就马上hold不住了,算了,还是谢谢你之前的帮助吧,以后也不劳驾你了。
返回顶部
顶部