指针能不能作为循环变量?

描述

指针能不能作为循环变量?指针有这么一道笔试题,一个数组,一个指针,一个循环,循环变量不是我们常见的整数,而是一个指针。首先,指针就是变量,它可以像普通类型一样来计算,所以把它当作循环变量当然没有问题。剩下的就是要搞清楚,它是如何移动的。
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
 指针运算需要注意它的步长。
#include 


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:~#
 如果把它理解成指向下一个元素,我觉得可能更容易接受一些。所以在写代码的时候,不同类型的指针不要随便赋值,除非你知道你在干什么,否则,就会出现一些不可预知的错误。比如下面的代码:
#include 


int main()
{
    int num[] = {1, 2, 3, 4, 5}; 
    char *p = (char *)num;


    p++;


    printf("%d
", *(int *)p);


    return 0;
}
 

num是个整型数组,每个元素占4个字节。



但是指针p是字符型指针,对p做自增操作,每次只能移动一个字节。很显然,已经不是一个完整的整数。所以这样的赋值,尽可能避免。



  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分