• 关于C语言指针中的p++与p+i


    先看一组代码:

    #include <stdio.h>
    void main()
    {
    	int i,*p,a[7];
    	p=a;
    	for(i=0;i<7;i++)
    		scanf("%d",p++);
    	printf("
    ");
    	for(i=0;i<7;i++,p++)
    		printf("%d",*p);
    }
    

     我们输入7个数,但输出的结果却是随机数。产生的原因为程序执行完第一组for循环后,指针已经指到了数组后的内存单元,如果想要输出该数组元素,则需重新将其首地址赋值给p(p=a)。

    以下是改正的版本————————————————

    当然我们还可以将p++替换为p+i;以下为参考代码————————————————

    #include <stdio.h>
    void main()
    {
    	int i,*p,a[7];
    	p=a;
    	for(i=0;i<7;i++)
    		scanf("%d",p+i);
    	printf("
    ");
    	for(i=0;i<7;i++)
    		printf("%3d",*(p+i));
    }
    

     其好处是从第二次循环后都不需要重新将指针指回数组首元素。

    方法 a[0]地址 a[1]地址 a[i]地址
    通过数组元素名 a[0] a[1] a[i]
    通过数组名a *a *(a+1) *(a+i)
    通过指针变量p *p *(p+1) *(p+i)
    下标法 p[0] p[1] p[i]

    因为p指向a的首地址,即a[0],所以a[i]=>*(a+i)=>*(p+i)。

    下一题用p+i有明显的优势————————

    输入十名学生成绩,计算平均分,输出高于平均分的成绩,使用指针完成该操作。

    我们先用p++,可以看到每循环一次都得重置p=a;

    #include <stdio.h>
    void main()
    {
    	int a[10],sum=0,*p,i;
    	float v;
    	p=a;
    	for(i=0;i<10;i++,p++)
    		scanf("%d",p);
    	p=a;
    	for(i=0;i<10;i++,p++)
    		sum+=*p;
    	v=sum/10;
    	printf("%f
    ",v);
    	p=a;
    	for(i=0;i<10;i++,p++)
    		if(*p>v) printf("%3d",*p);
    }
    

     而用p+i的话则不需要————————————

    #include <stdio.h>
    void main()
    {
        int a[10],*p,i,sum=0;
        float v;
        p=a;
        for(i=0;i<10;i++)
            scanf("%d",p+i);
        for(i=0;i<10;i++)
            sum+=*(p+i);
        v=sum/10;
        printf("%f
    ",v);
        for(i=0;i<10;i++)
            if(*(p+i)>v) printf("%3d",*(p+i));
    }
  • 相关阅读:
    洛谷 PT2 First Step (ファーストステップ)
    Mask-D、绮梦与空谷幽兰
    僕らの手には何もないけど、
    魔都蹭课、观光、酱油记
    竞赛计划
    糖果
    点名
    数字对
    字符串哈希
    负环
  • 原文地址:https://www.cnblogs.com/ssh-007/p/4419111.html
Copyright © 2020-2023  润新知