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) 应该怎么判断呢? 展开
如果定义了一个数组 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) 应该怎么判断呢? 展开
7个回答
展开全部
1. temp用做array名称时,已经不能进行temp++计算。其代表之数据是固定的。
2. 依照宣告,temp是array,内放两个元素,元素之型态是char *,
分别代表 address:0x01 & address:0x02
3. 你要讨论的应该是 char *ptr 的ptr计算,超过阵列范围吧。
在指标计算中,他不会考虑所存取或代表之阵列的长度,
指标变量就只是个数据值,可以随便你加减。
指标变量超过范围时,那就会存取到其他变量或记忆体位置,
这里要小心控制指标的存取,可能会引起功能错误,系统错误讯息,或是当机。
4. 对於Array,建议采用Array存取,比较安全。采用*ptr要自己控制好安全性。
可在数组尾巴加一个不会使用到的值,当作结尾,例如0x00。
直接编程测试看看,每个改变都记得印出相关变量的数值,应该就会比较清楚变化。
2. 依照宣告,temp是array,内放两个元素,元素之型态是char *,
分别代表 address:0x01 & address:0x02
3. 你要讨论的应该是 char *ptr 的ptr计算,超过阵列范围吧。
在指标计算中,他不会考虑所存取或代表之阵列的长度,
指标变量就只是个数据值,可以随便你加减。
指标变量超过范围时,那就会存取到其他变量或记忆体位置,
这里要小心控制指标的存取,可能会引起功能错误,系统错误讯息,或是当机。
4. 对於Array,建议采用Array存取,比较安全。采用*ptr要自己控制好安全性。
可在数组尾巴加一个不会使用到的值,当作结尾,例如0x00。
直接编程测试看看,每个改变都记得印出相关变量的数值,应该就会比较清楚变化。
参考资料: 自己
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
LZ你这种定义的方式可能是不对的 unsigned char *temp[]={0X01,0X02};
现在手头没有编译器没有办法验证。
所以也不太理解后面while循环中*temp是表达什么含义。
对指针判断条件为0时(*p == 0),一般是判断指针是否为空,对字符串数组来说最后一位会默认是‘\0’,也就是空了,可以通过这种方式判断字符串数组是否结束。
现在手头没有编译器没有办法验证。
所以也不太理解后面while循环中*temp是表达什么含义。
对指针判断条件为0时(*p == 0),一般是判断指针是否为空,对字符串数组来说最后一位会默认是‘\0’,也就是空了,可以通过这种方式判断字符串数组是否结束。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的代码应该会有一个警告和一个错误..
警告:类型不匹配, 你要这样改:unsigned char *temp[] = {(char *)0x01, (char *)0x02};
错误:数组名是常量, 任何试图改变数组名的操作都是非法的, 所以temp++是非法的.
警告:类型不匹配, 你要这样改:unsigned char *temp[] = {(char *)0x01, (char *)0x02};
错误:数组名是常量, 任何试图改变数组名的操作都是非法的, 所以temp++是非法的.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
每一个数组的结尾都有一个 '\0' ('\0'的ASCII代码为0)是等价的 也就是说while(*temp!='\0')和 while(*temp!=0) 是等价的。也就是说循环条件是没有问题的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询