C指针的问题

Nestler 2013-01-21 03:21:34
char *ptr;
ptr=0;
这句的意思是指针指向内存的0号单元吗?
这句话的作用是什么?
















[/code]
...全文
420 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yu275184637 2013-01-25
  • 打赏
  • 举报
回复
ptr = 0;相当于让ptr指向将存储在静态区中的0,作用是为ptr初始化,让它不是一个野指针,防止越界访问。 最好写成ptr = NULL; 不过第一种写法也没与问题。
a767175432 2013-01-25
  • 打赏
  • 举报
回复
对 要从汇编理解C才是最准确的 首先你得明白什么是字节单元 这个问题的答案我不在这里说明,你自己做实验分析, 还要考虑CPU寻址和定位方式 联系段寄存器来判断传的是偏移还是物理地址
Nestler 2013-01-24
  • 打赏
  • 举报
回复
引用 24 楼 forxindetour 的回复:
在这个帖子学到了两点。一点是指针的初始化和赋值,一点是有一位大神对C语言学习的理解。
没想到这么多人帮忙解围呀~呵呵,CSDN确实强大
china_ssl 2013-01-24
  • 打赏
  • 举报
回复
引用 楼主 jy02326166 的回复:
char *ptr; ptr=0; 这句的意思是指针指向内存的0号单元吗? 这句话的作用是什么? [/code]
你理解完全正确就是让ptr指向null
_Jerry 2013-01-23
  • 打赏
  • 举报
回复
在这个帖子学到了两点。一点是指针的初始化和赋值,一点是有一位大神对C语言学习的理解。
wizard_tiger 2013-01-23
  • 打赏
  • 举报
回复
这个算是初始化吧! 不过建议写成ptr=NULL;
jdwq33 2013-01-23
  • 打赏
  • 举报
回复
引用 6 楼 abcdhy 的回复:
因为指针其实就是一个 int 数据,新定义一个指针,系统并不会初始化,指针是有一个数值的、 ptr=0; 作用就是初始化指针,避免修改了其他内存中的数据。 但一般会写成 ptr = NULL;
我也赞成这样的说话,从某些方面来说给指针赋值就是操作地址。
Dson2020 2013-01-23
  • 打赏
  • 举报
回复
对于楼主的代码,我的理解比较浅显:就是定义一个指针变量,然后对其初始化。
aljadyan 2013-01-23
  • 打赏
  • 举报
回复
赋0就相当于给指针赋了NULL,因为NULL的ascii码就是0,这样做就是相当于初始化!
逍遥子_ 2013-01-22
  • 打赏
  • 举报
回复
char *ptr;是指定义一个指针变量, ptr=0;是将变量的值赋值为0,不应将其理解为0号内存的地址,0号内存也访问不了。
jiandingzhe 2013-01-22
  • 打赏
  • 举报
回复
将地址置0通常用于表示自己未初始化,因为对0地址析值,在大部分系统里会立即抛出一个错误。这样便于运行时查错。
star60 2013-01-22
  • 打赏
  • 举报
回复
char *p;这是声明。 p = 0;这是赋值,因为NULL就是宏定义的0值,所以会把p指针指向一块系统特殊内存块去,这是一块程序不允许访问的地方。
半行注释 2013-01-22
  • 打赏
  • 举报
回复
正常情况下 0 = NULL NULL用于赋值空指针
SKATE11 2013-01-22
  • 打赏
  • 举报
回复
是的 跟指向NULL一样
Ericz 2013-01-22
  • 打赏
  • 举报
回复
因为指针存在很大的风险,所以使用指针的时候要特别小心。 使用指针最常见的一个错误就是野指针问题,也就是定义一个指针没有初始化,也没有 正确分配空间,然后对其进行解引用: 比如: char *ptr; *ptr = 'a'; /* 这里程序就会出现不可预测的行为,一般来说会被操作系统杀死 */ 由于野指针的问题很难检查出来,并且也没有办法通过程序自己检查出错误,所以使用指针的时候 一定要对其进行初始化,也就是把一个指针初始化为NULL,这样这个指针就是一个空指针, 空指针的问题在程序中都可以自己检查出来,因此空指针的危害要大大小于野指针。 char *ptr = NULL; ... if(ptr) { *ptr = 'a'; /* 这里如果ptr是空指针,那么就不会执行到这里,并且可以让程序报告 错误,这样大大增加了程序的健壮性 */ } else { printf("Bad ptr...\n"); error_ops(); } 楼主的代码也就是想对指针进行初始化,初始化的用途我上面也描述了。但是提醒楼主一下: 对一个指针直接赋值一个整数这种做法是不提倡的,这样的代码不规范,不利于调试, 因此正确的初始化方法就是我上面写的那样: char *ptr = NULL;
ForestDB 2013-01-21
  • 打赏
  • 举报
回复
将其指向内存地址为0的那块。
赵4老师 2013-01-21
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单! 指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认: 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物; 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。 这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑! 这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!! 提醒: “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习C和汇编的对应关系。” 不是一回事! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
疯狂的红豆 2013-01-21
  • 打赏
  • 举报
回复
char *p;这是定义,但是未初始化 p = 0;这是赋值,因为NULL就是宏定义的0值,所以会把p指针指向一块系统特殊内存块去,这是一块程序不允许访问的地方。
lin5161678 2013-01-21
  • 打赏
  • 举报
回复
引用 8 楼 shn521 的回复:
引用 2 楼 jy02326166 的回复:*ptr=0; 是不是可以给字符赋值null? NULL是个宏,就是0
NULL是一个宏+1 就是0 换一下吧 一般是0
swlilike 2013-01-21
  • 打赏
  • 举报
回复
他写的不是 ptr= 0么 又不是*ptr = 0
加载更多回复(8)

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧