指针变量的的各种自增 *p++

这个问题其实是论述*P++等价于(*p)++还是等价于*(p++)的问题,为了验证这个问题,我编写了下面的小程序(vc++6.0编译环境),作为验证
程序1
#include "stdio.h"
void  main()
{
    int a=2
;
    int *p=&
a;
    int *pold;//记录P指向的地址,为了作为比较使用

    pold= p;
    //-----------原来的信息

    printf("原来的a=%d " ,a);
    printf("原来的p=%x "
,p);
    printf("原来的pold=%x "
,pold);
    //----------进行变化

    printf("*p++的结果=%d,a的结果a=%d ",*p++ ,a);
    printf("地址变化的结果p-pold=%x ",p-
pold);
}
运行结果是:
程序2
#include "stdio.h"
void main()
{
     int a=2;
     int *p=&a;
     int *pold; // 记录P指向的地址,为了作为比较使用
    pold=p;
     // -----------原来的信息
    printf("原来的a=%d ",a);
    printf("原来的p=%x ",p);
    printf("原来的pold=%x ",pold);
     // ----------进行变化
    printf("(*p)++的结果=%d,a的结果a=%d ",(*p)++,a);
    printf("a的结果a=%d ",a);
    printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果
程序3
#include "stdio.h"
void main()
{
     int a=2;
     int *p=&a;
     int *pold; // 记录P指向的地址,为了作为比较使用
    pold=p;
     // -----------原来的信息
    printf("原来的a=%d ",a);
    printf("原来的p=%x ",p);
    printf("原来的pold=%x ",pold);
     // ----------进行变化
    printf("a=%d,(*p)++的结果=%d,a的结果a=%d ",a,(*p)++,a);
    printf("a的结果a=%d ",a);
    printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果:
程序4
#include "stdio.h"
void main()
{
     int a=2;
     int *p=&a;
     int *pold; // 记录P指向的地址,为了作为比较使用
    pold=p;
     // -----------原来的信息
    printf("原来的a=%d ",a);
    printf("原来的p=%x ",p);
    printf("原来的pold=%x ",pold);
     // ----------进行变化
    printf("*(p++)的结果=%d,a的结果a=%d ",*(p++),a);
    printf("a的结果a=%d ",a);
    printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果:
程序5
#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d ",*p++,(*p)++,*q++);
    printf("%d ",a); 
}

运行结果

程序6

#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d ",(*p)++,*p++,*q++);
    printf("%d ",a); 
}

运行结果:

程序7:

#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d %d ",(*p)++,*p++,*q++,a);
    printf("%d ",a); 
}

运行结果:

程序8:

#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d  ",*p++,(*p)++,*q++);
    p=&a;q=&a;
    printf("%d %d %d %d ",a,*p,(*q)++,a); 
    printf("%d %d %d  %d ",a,++(*p),++(*q),a); 
    printf("%d ",a);
    
}

运行结果: 

综上所述:
*p++是先取出*p的值,然后让p++
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
而且printf的运行顺序是从右向左运行。而且++是在整个运算表达式运算完才进行,而且右++的执行顺序是从左到右进行。而左++遇到变量就会立即增加变量的值。
 
验证printf的运算顺序
#include "stdio.h"
void main()
{
     int a=2;
    printf("a++=%d,++a=%d,a++=%d ",a++,++a,a++);
    printf("a=%d ",a);
}
运行结果:

剩下的工作就是你自己慢慢体会了。

以前学的时候弄的很清楚,可是现在发现又忘了,腾讯的笔试考了几道这样的题型,让我回来好好的在电脑测试整理整理了一下

发现以下结果:

*p++是先取出*p的值,然后让p++
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
  void main()
{
 int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d  ",*p++,(*p)++,*q++);
 cout<<a<<endl;
    p=&a;q=&a;
    printf("%d %d %d %d ",a,*p,(*q)++,a);
    printf("%d %d %d  %d ",a,++(*p),++(*q),a);
    printf("%d ",a);
 getchar();
}
2 2 3 2 2 3
4 4 3 4 6 6 6 6 6
而且printf的运行顺序是从右向左运行。而且右++的执行顺序是从左到右进行。而左++遇到变量就会立即增加变量的值。
验证printf的运算顺序
#include "stdio.h"
void main()
{
    
int a=2;
    printf(
"a++=%d,++a=%d,a++=%d ",a++,++a,a++);
    printf(
"a=%d ",a);
}
运行结果:
a++=4,++a=5,a++=2 a=5
 
 
 
#include <iostream>
#define f(x) x*x
void main()
{
 int a=2;
 cout<<f(a++);
 cout<<f(++a);}
运行结果: 4  36
 
*p++等价于*(P++)一样
*p++;
1.* 和 ++都是单目运算符,处于同一优先级;
2.这两个运算符的结合性是自右至左;

so,p先与++结合~ 你需要理解操作副的优先级 *的优先级比++一样,因此 *p++和*(p++)的结果是将首先使用P指针指向的数据,然后P+1
 
  
 
  
#include<stdio.h>
int main( )
{ 
	int a[10]={0,1,2,3,4,5,6,7};
	int *p=a;
    printf("%d ,%d ,%d\n",*p++,(*p)++,*(p++)); //0 0 0 2   
 //printf("%d\n",*p++); //0   1 *(解应用)与++ 同级别 但从右向左结合,所以先取出*p该值,然后p++  后自增 所以先引用再自增的 所以先输出*p 再p++


	//	printf("%d\n",(*p)++);//0  1执行取值操作对该值进行加加 先应用后自增 所以先输出了
//	printf("%d\n",++(*p));// 1   1先加加再引用输出改值 
//	printf("%d\n",*(p++));//0   1  //
 //	printf("%d\n",* ++p);//1   1先p++ 再引用
//  printf("%d\n",++*p);//1   1先*取值再值++从右向左优先级     




// printf("%d\n",++(*p));//1  1先                           
 printf("%d\n",*p);
return 0;


}
//以上的结果,在执行的时候。除了最后一句是共有的其余的各句都是单一执行,互斥的
例如 //下面例子可能有部分错误

int a[5]={1,2,3,4,5};
int *p = a;

*p++ 先取指针p指向的值(数组第一个元素1),再将指针p自增1;

        cout << *p++; //  结果为 1

        cout <<(*p++);  // 1

(*p)++ 先去指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2
        cout << (*p)++; //  1
        cout <<((*p)++)  //2
*++p   先将指针p自增1(此时指向数组第二个元素),* 操作再取出该值

        cout << *++p; //  2
        cout <<(*++p)  //2

++*p  先取指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2)
      cout <<++*p; //   2    
        cout <<(++*p)  //2

注意,上面的每条cout输出,要单独输出才能得到后面的结果。
*p++和*(p++)是一样的,先*p然后再p++,因为后面的++要遇到;(分号)才执行 ,所以p++在最后执行,并不是在括号里面执行。++*p说反了, cout<<*p++;输出的是p所指变量空间自增之前的值,而*p++;cout<<*p;是先将p所指变量空间自增,再输出其所指变量空间的值。
http://zhidao.baidu.com/link?url=cPqvf7lUrwbPCFfZ_B-uRr47-CuYIfGknVitrh-qwfzKRpIKGDemPM2NChuT4bIADgIsmuvK3LFV7GEyK-NZR_
 http://blog.csdn.net/niuyongjie/article/details/2490869
http://blog.sina.com.cn/s/blog_67b081c50100i34o.html
http://www.cjjjs.com/paper/bcyy/20167513311193.aspx

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值