(*p)++和*(p++)和*p++的区别

测试的代码如下:

#include "stdafx.h"
#include "stdio.h"
#include 
int _tmain(int argc, _TCHAR* argv[])
{
	int a[50]={0,0,0,0};
	int *p;
	p=a;
	int k1,k2,k3;
	//测试第一部分
	printf("%d\n",p);
	*p++=10;
	printf("%d\n",p);
	printf("%d\n",a[0]);//这里不用*p来读取数值是因为p的值已经改变,只好用a[0]来实现。
	printf("%d\n",a[1]);
	//测试第二部分
	int b[5]={1,2,3,4,5};
	int *q;
	q=b;
	k1=*q++;
	q=b;
	k2=(*q)++;
	q=b;
	k3=*(q++);
	printf("k1的值是%d\n",k1);
	printf("k2的值是%d\n",k2);
	printf("k3的值是%d\n",k3);
    return 0;
	
}

(*p)++和*(p++)和*p++的区别_第1张图片

从上面的结果分析可看出,测试的第一部分
*p++=10;
实现的是将10赋值给*p后p在自增1,也就是使得a[0]的值为10,而不是a[1]的值为10;

测试第二部分:

k1=*q++;
先将*p的值赋给k1,然后q值再自增;

k2=(*q)++;

先将*p的值赋给k2,然后q值再自增;

k3=*(q++);
先将q自增,然后再赋值;

区别指针在表达式的左侧还是右侧!


指针方法实现堆栈:

//堆栈测试
	int a[5]={1,2,3,4,5};
	int *p=a+3;
	int stacklow=0;//栈底
	int stackhigh=0;//栈顶
	int test;
	printf("%d\n",*p);

	*p++=stacklow;//压栈,先将数值传递给*p,然后p再自增;
	printf("a[3]的数值是%d\n",a[3]);//是先将0赋值给*p,也就是a[3],此处不能有*p来测试,因为这样p的值已经改变了
	printf("*p的数值是%d\n",*p);

        p=a+4;
	stackhigh=*p--;//出栈,先将栈顶数值5传递给stackhigh,之后再自减
	printf("stackhigh的数值是%d\n",stackhigh);
(*p)++和*(p++)和*p++的区别_第2张图片

你可能感兴趣的:(C/C++)