C语言指针指向数组的一个小疑惑

C语言了解的不够渗透,想请问一个简单的问题如果定义了一个数组unsignedchar*temp[]={0X01,0X02};可知,temp数组里面有2个元素如果有个循环是... C语言了解的不够渗透,想请问一个简单的问题
如果定义了一个数组 unsigned char *temp[]={0X01,0X02};
可知,temp数组里面有2个元素
如果 有个循环是 while(*temp!=0){temp++;}; 这个样子的
可知 temp=0的时候,它的值是0x01 因为不等于0,所以进入循环
然后temp++,再次判断*temp是不是等于0,因为 此时temp的地址加1了,它的值就是 0x02 了,这个应该都好理解吧,因为0x02不等于0,所以 while循环又是真的
在while循环里面,再给 temp++
因为temp数组里面只有2个元素,如果此时temp地址再加1的话,数组里面已经没元素了,此时 while(*temp!=0) 应该怎么判断呢?
展开
 我来答
滴八哥
2012-11-29
知道答主
回答量:10
采纳率:0%
帮助的人:1.6万
展开全部
  • 首先,这个数组的初始化是错误的,在定义中temp是一个数组,数组中的元素是指向unsigned char类型的指针,因此用整型的0X01和0X02初始化指针是错误的。应改为

  • 其次,如上定义,当循环到数组界外时,由于此时*temp的值是随机的,因此while(*temp  != 0)的结果也是随机的。这种行为叫做数组越界访问,是一个Bug,不应出现在程序里。

  • 再次,改正方案,

    不知道对你有没有帮助。

johnwanz
2012-11-29 · TA获得超过781个赞
知道小有建树答主
回答量:716
采纳率:80%
帮助的人:233万
展开全部
1. temp用做array名称时,已经不能进行temp++计算。其代表之数据是固定的。
2. 依照宣告,temp是array,内放两个元素,元素之型态是char *,
分别代表 address:0x01 & address:0x02
3. 你要讨论的应该是 char *ptr 的ptr计算,超过阵列范围吧。
在指标计算中,他不会考虑所存取或代表之阵列的长度,
指标变量就只是个数据值,可以随便你加减。
指标变量超过范围时,那就会存取到其他变量或记忆体位置,
这里要小心控制指标的存取,可能会引起功能错误,系统错误讯息,或是当机。
4. 对於Array,建议采用Array存取,比较安全。采用*ptr要自己控制好安全性。
可在数组尾巴加一个不会使用到的值,当作结尾,例如0x00。

直接编程测试看看,每个改变都记得印出相关变量的数值,应该就会比较清楚变化。

参考资料: 自己

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
MeanSift
2012-11-29 · 超过33用户采纳过TA的回答
知道答主
回答量:85
采纳率:0%
帮助的人:74.9万
展开全部
LZ你这种定义的方式可能是不对的 unsigned char *temp[]={0X01,0X02};
现在手头没有编译器没有办法验证。
所以也不太理解后面while循环中*temp是表达什么含义。
对指针判断条件为0时(*p == 0),一般是判断指针是否为空,对字符串数组来说最后一位会默认是‘\0’,也就是空了,可以通过这种方式判断字符串数组是否结束。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2012-11-29
知道答主
回答量:30
采纳率:0%
帮助的人:10.6万
展开全部
你的代码应该会有一个警告和一个错误..
警告:类型不匹配, 你要这样改:unsigned char *temp[] = {(char *)0x01, (char *)0x02};

错误:数组名是常量, 任何试图改变数组名的操作都是非法的, 所以temp++是非法的.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pt...c@163.com
2012-11-29 · TA获得超过103个赞
知道答主
回答量:275
采纳率:0%
帮助的人:84.7万
展开全部
每一个数组的结尾都有一个 '\0' ('\0'的ASCII代码为0)是等价的 也就是说while(*temp!='\0')和 while(*temp!=0) 是等价的。也就是说循环条件是没有问题的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式