[C语言](*p)++ 与 *p++ 与 ++*p

转自:http://www.cnblogs.com/IAmBetter/p/3175711.html

 

环境:win7

编译器:GCC

 

1.先说++i和i++的基础

代码如下:

#include <stdio.h>
 
//just change simple
void stop(void)
{
    system("pause");    
}
 
int main(void)
{
    int i = 1;
    printf("i++ = %d\n",i++);
    printf("i = %d\n",i);
     
    int j = 1;
    printf("++j = %d\n",++j);  
    printf("j = %d\n",j);
     
    printf("i++ = : %d   ++i = %d\n",i++,++i);
    printf("i = %d\n",i);
    printf("++j = : %d   j++ = %d\n",++j,j++);
    printf("j = %d\n",j);
    stop();
    return 0;
}

运行结果:

i++ = 1
i = 2
++j = 2
j = 2
i++ = : 3   ++i = 3
i = 4
++j = : 4   j++ = 2
j = 4

在ubuntu中运行结果如下:

注意:

1) i++只有遇到";"分号才会影响i的值, i++输出的值还是1,i的值也是1

2) i经过分号之后,i=2,因为自增了

3) ++j不管遇到不遇到分号";"都会影响j值和++j值,所以J=2

4)j的值也是2

5)  根据编译器的不同和操作系统的不同,printf计算方向也不同。在win7中printf是从右向左执行因为操作的是输出栈!从右开始计算,先++i,再i++,所以输出3 和3。但在Ubuntu中却输出不一样的结果。所以,在实际应用中,不应该写出这样的代码!!!

6)最后一个i++遇到了分号,所以i=4

7) 从右开始计算,j打印的结果还是2,但是第二次取出来的值是3,所以++j=4

 

2.理清概念  *p++ 中 *和++的优先级

#include <stdio.h>

//just change simple
void stop(void)
{
      system("pause");     
}

int main(void)
{
     int i = 5;
     int *p;
     int v;
     p = &i;
     
     printf("1-p = %p\n",p);
     printf("1-*p = %d\n",*p);
    v = *p++; 
     printf("v = %d\n",v); 
     printf("2-p = %p\n",p);
     printf("1-*p = %d\n",*p);
     printf("i = %d\n",i); 
     system("pause");
     return 0;
}

 

运行结果:

1-p = 0x7ffeb4672f80
1-*p = 5
v = 5
2-p = 0x7ffeb4672f84
1-*p = 5
i = 5

从结果来看++符号影响了p的值并没有影响i的值,++的优先级要高于 指针*符号

 

再看例子

#include <stdio.h>

//just change simple
void stop(void)
{
      system("pause");     
}

int main(void)
{
     int i = 5;
     int *p;
     int v;
     p = &i;
     
     printf("1-p = %p\n",p);
     printf("1-*p = %d\n",*p);
     v = ++*p; 
     printf("v = %d\n",v); 
     printf("2-p = %p\n",p);
     printf("1-*p = %d\n",*p);
     printf("i = %d\n",i); 
     system("pause");
     return 0;
}

 

运算结果:

1-p = 0x7ffe33f90ff0
1-*p = 5
v = 6
2-p = 0x7ffe33f90ff0
2-*p = 6
i = 6

怎么++不影响p的值了?

 

再看例子

把 代码稍微调整:v = *++p;

运算结果:

1-p = 0x7ffece92b660
1-*p = 5
v = 32766
2-p = 0x7ffece92b664
2-*p = 32766
i = 5

啊额,原来 * 和++优先级是同一级别,同一级别按照从右往左的顺序计算。

 

下面是一条面试题:

#include <stdio.h>

//just change simple
void stop(void)
{
      system("pause");     
}

int main(void)
{
    int a[] = {1,2,3,4,5,6,7,8,9};
    int *p = a;

    printf("*p = %d\n", *p);
    printf("*p++ = %d\n", *p++);
    printf("*(p++) = %d\n", *(p++));
    printf("*p = %d\n", *p);
    printf("(*p)++ = %d\n",(*p)++);
    p += 3;
    printf("&a = %d\n", &a);
    printf("*p = %d,&a+3 = %d\n", *p, &a+3);
     return 0;
}

运行结果:

*p = 1
*p++ = 1
*(p++) = 2
*p = 3
(*p)++ = 3
&a = -299729216
*p = 6,&a+3 = -299729108

注:

1)由于++比*优先级高,所以printf("*(p++) = %d\n", *(p++));等同于printf("*p++ = %d\n", *p++);

2)解析&a+3:由于数组a在初始化时定义数组长度为9,即占用内存空间sizeof(int)*9=4*9=36,而&a代表数组a首地址,+3表示指向数组第四行,

即&a+3 = a[0]地址+36*3=a[0]地址+108。

 

把上面代码中数组和指针p的初始化改为:

char a[] = {1,2,3,4,5,6,7,8,9};
char *p = a;

运行结果:

*p = 1
*p++ = 1
*p = 2
*(p++) = 2
*p = 3
(*p)++ = 3
&a = -318663840
*p = 6,&a+3 = -318663813

 

posted on 2016-10-08 16:00  suwen  阅读(1837)  评论(0编辑  收藏  举报

导航