指针能不能作为循环变量?有这么一道笔试题,一个数组,一个指针,一个循环,循环变量不是我们常见的整数,而是一个指针。首先,指针就是变量,它可以像普通类型一样来计算,所以把它当作循环变量当然没有问题。剩下的就是要搞清楚,它是如何移动的。
for(p=s+1;p < s + 4; p++)
p的初值是s+1,s是数组首元素地址,加一就是第二个元素地址,于是指针 p 指向数组第二个元素,就是B。
printf在输出字符串的时候,后面的参数是个地址,就是从这个地址开始向后逐个输出,直到遇到�,于是,第一次循环结果就是BCD。接下来,是p++操作,p加一会加几个字节,主要取决于它指向的内存是什么类型。char *p说明它指向的是char类型的数据,char类型数据在内存中占一个字节,所以p+1也就加一个字节,p指向了字符C,输出CD。
一共循环三次,所以结果就一目了然了。
BCD CD D
指针运算需要注意它的步长。
int main()
{
int num, *p = #
char ch, *q = &ch;
printf("p的值 %p
", p);
printf("p+1的值 %p
", p + 1);
printf("q的值 %p
", q);
printf("q+1的值 %p
", q + 1);
return 0;
}
比如,同样是指针,int *和char *,它俩加一的结果就不一样,一个加四个字节,一个加一个字节。
root@Turbo:~# ./test
p的值 0x7ffc8116daf4
p+1的值 0x7ffc8116daf8
q的值 0x7ffc8116daf3
q+1的值 0x7ffc8116daf4
root@Turbo:~#
如果把它理解成指向下一个元素,我觉得可能更容易接受一些。所以在写代码的时候,不同类型的指针不要随便赋值,除非你知道你在干什么,否则,就会出现一些不可预知的错误。比如下面的代码:
int main()
{
int num[] = {1, 2, 3, 4, 5};
char *p = (char *)num;
p++;
printf("%d
", *(int *)p);
return 0;
}
num是个整型数组,每个元素占4个字节。
但是指针p是字符型指针,对p做自增操作,每次只能移动一个字节。很显然,已经不是一个完整的整数。所以这样的赋值,尽可能避免。
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
字符串
+关注
关注
1文章
551浏览量
20123 -
指针
+关注
关注
1文章
473浏览量
70361 -
代码
+关注
关注
30文章
4555浏览量
66767 -
变量
+关注
关注
0文章
595浏览量
28112
原文标题:指针作为循环变量
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
AD7682/AD7689内部参考电压能不能作为其他电路的参考电压?
AD7682/AD7689内部参考电压能不能作为其他电路的参考电压?
例如,能不能设定AD7682从REF pin输出2.5V内部参考电压,接到ADA4841的正极端作为level
发表于 12-21 06:52
共享变量能不能实现这种功能呢
各位大神好,请问用labview能不能实现这样一种功能,在前面板中的按钮控制某一VI的运行,这一个VI的运行结果又返回到主VI,不知道用共享变量能不能实现。描述的不够清楚,勿怪,谢谢。
发表于 12-30 09:52
请问AD7682内部参考电压能不能作为其他电路的参考电压?
AD7682/AD7689内部参考电压能不能作为其他电路的参考电压?例如,能不能设定AD7682从REF pin输出2.5V内部参考电压,接到ADA4841的正极端作为level sh
发表于 12-14 09:11
下周五|功耗分析能不能再提前亿点点?
原文标题:下周五|功耗分析能不能再提前亿点点? 文章出处:【微信公众号:新思科技】欢迎添加关注!文章转载请注明出处。
拼接屏能不能触屏操作?
拼接屏能不能直接触屏操作,小编回答可以的,实际上很多客户购买拼接屏时都会提出拼接屏能不能加触摸的功能?我们回复是可以的,那是一种怎样的原理呢? 拼接屏一般是用来大屏展示,用来播放文字、图像等内容
评论