鱼C论坛

 找回密码
 立即注册
查看: 2331|回复: 18

C的指针问题

[复制链接]
发表于 2016-6-30 11:01:00 | 显示全部楼层 |阅读模式

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

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

x
# include <stdio.h>

int main()
{
        int i = 5;
        int *p, *q;
  

         p = &i;
     *q = p;
   


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

        return 0;
}


为什么程序会出错?   *q = p不行吗?不同类型不是可以相互赋值吗,只是会丢失数据而已啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 12:23:42 | 显示全部楼层

那你非要说 不同类型可以相互赋值  我也是没办法的。

上边这句话从汇编角度上说 应该是可以的,毕竟寄存器之间可以委屈转换一下,但是除非你不用编译器,否则就得遵循人家编译器的规则。(有的隐式转换可以,但是有的就有限制啊)

还有一个地方,你q这个指针变量没有初始值,就算编译器不跟你计较,系统也会找你的事啊。万一指向0x00000000了呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-30 17:59:18 | 显示全部楼层
n0noper 发表于 2016-6-30 12:23
那你非要说 不同类型可以相互赋值  我也是没办法的。

上边这句话从汇编角度上说 应该是可以的,毕竟寄 ...

q里面不是垃圾值吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-30 21:19:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 22:10:04 | 显示全部楼层
学习电脑 发表于 2016-6-30 17:59
q里面不是垃圾值吗?


你确定?

垃圾值到底是多少?万一是0x00000000呢?

具体调试,我也不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-1 09:27:29 | 显示全部楼层
n0noper 发表于 2016-6-30 22:10
你确定?

垃圾值到底是多少?万一是0x00000000呢?

好吧,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-1 09:28:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-1 10:22:31 | 显示全部楼层
你要相互赋值也不是没有办法,强制类型转换就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-1 11:19:08 | 显示全部楼层
GameBelial 发表于 2016-7-1 10:22
你要相互赋值也不是没有办法,强制类型转换就行了。

不转换就不行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-1 14:12:37 | 显示全部楼层
指针不赋初值,野指针比较危险
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-1 15:10:55 | 显示全部楼层
GameBelial 发表于 2016-7-1 10:22
你要相互赋值也不是没有办法,强制类型转换就行了。

似乎转换类型也不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-2 11:24:38 | 显示全部楼层
养成良好的变成习惯,不要使用野指针。除非你知道自己在做什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-2 14:58:27 | 显示全部楼层
不行只能
int main()
{   int i = 5;
    int *p,*q;
    p = &i;
    q = p;
    printf("Hello world!%d\n",*p);
    printf("Hello world!%d\n",*q);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-2 18:38:42 | 显示全部楼层
阁龙1427 发表于 2016-7-2 11:24
养成良好的变成习惯,不要使用野指针。除非你知道自己在做什么

野指针就是每赋值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-4 09:15:44 | 显示全部楼层
学习电脑 发表于 2016-7-2 18:38
野指针就是每赋值?

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-4 10:12:57 | 显示全部楼层
阁龙1427 发表于 2016-7-4 09:15
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建 ...

xiexie
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-4 10:35:24 | 显示全部楼层

    “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
    (1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
    (2)、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
这个是在chao_yu的博客中看到的,这个解释能理解吧 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-4 10:39:33 | 显示全部楼层

就像玩指身体部位的游戏。让你指哪里就指哪里,初始化的时候要指向脚(赋初值),然后让你指耳朵就指向耳朵。如果让你指脸你指人家屁股就是要出问题的吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-6 11:35:17 | 显示全部楼层
阁龙1427 发表于 2016-7-4 10:35
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易 ...

恩,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 04:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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