[C語言](*p)++ 與 *p++ 與 ++*p

轉自:http://www.cnblogs.com/IAmBetter/p/3175711.htmlhtml

 

環境:win7面試

編譯器:GCCubuntu

 

1.先說++i和i++的基礎數組

代碼以下:spa

#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中運行結果以下:指針

注意:code

1) i++只有遇到";"分號纔會影響i的值, i++輸出的值仍是1,i的值也是1htm

2) i通過分號以後,i=2,由於自增了blog

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
相關文章
相關標籤/搜索