C語言指針與自增詳解


在初學C語言,接觸指針的時候,真的是比較迷惑的一件事,恰巧指針還和自增運算符碰到一起了,更是碰出了無限的可能,正所謂兩儀生四象,四象生八卦啊
為了期末考試,徹底弄明白指針和自增運算符在一起時的各種可能和現象,我們可以直接通過編寫C代碼來試驗一下

先上結論:

(*p)++,先傳值,后值自增1,類比a++
*p++ == *(p++),先傳值,后地址自增1
++*p == ++(*p),先值自增1,后傳值,類比++a
*++p == *(++p),先地址自增1,后傳值

代碼中設計了ABCDEFG一共7種可能會出現的情況,對應着ABCDEFG這7個函數

函數名 類型
A (*p)++
B *p++
C *(p++)
D ++*p
E ++(*p)
F *++p
G *(++p)

然后通過傳入一個數組[10,20,30],讓指針和自增在數組上進行造作,看看最后是什么結果,指針的值有什么變化,來推斷出7種可能的結論

源碼可以運行,方便更直觀的看出指針與自增在一起的運算順序

#include <stdio.h>

void A(int array[3])
{
    int *p = NULL;//定義一個指針
    p = array;//指向數組的首地址,以方便觀察指針的移動情況,后續的函數B~G類似
    printf("-----    A    -----\n");
    printf("> *p=%d\n\n",*p);
    printf("printf(\"> (*p)++=%%d\\n\",(*p)++);\n");
    printf("> (*p)++=%d\n",(*p)++);//> (*p)++=10,先傳值,后值自增1,類比a++
    printf("\n");
    printf("printf(\"> *p=%%d\\n\",*p);\n");
    printf("> *p=%d\n",*p);//> *p=11
    printf("\n");
}

void B(int array[3])
{
    int *p = NULL;
    p = array;
    printf("-----    B    -----\n");
    printf("> *p=%d\n\n",*p);
    printf("printf(\"> *p++=%%d\\n\",*p++);\n");
    printf("> *p++=%d\n",*p++);//> *p++=10,先傳值,后地址自增1
    printf("\n");
    printf("*printf(\"> *p=%%d\\n\",*p);\n");
    printf("> *p=%d\n",*p);//> *p=20
    printf("\n");
}

void C(int array[3])
{
    int *p = NULL;
    p = array;
    printf("-----    C    -----\n");
    printf("> *p=%d\n\n",*p);
    printf("printf(\"> *(p++)=%%d\\n\",*(p++));\n");
    printf("> *(p++)=%d\n",*(p++));//> *(p++)=10,先傳值,后地址自增1
    printf("\n");
    printf("printf(\"> *p=%%d\\n\",*p);\n");
    printf("> *p=%d\n",*p);//> *p=20
    printf("\n");
}

void D(int array[3])
{
    int *p = NULL;
    p = array;
    printf("-----    D    -----\n");
    printf("> *p=%d\n\n",*p);
    printf("printf(\"> ++*p=%%d\\n\",++*p);\n");
    printf("> ++*p=%d\n",++*p);//> ++*p=11,先值自增1,后傳值
    printf("\n");
    printf("printf(\"> *p=%%d\\n\",*p);\n");
    printf("> *p=%d\n",*p);//> *p=11
    printf("\n");
}

void E(int array[3])
{
    int *p = NULL;
    p = array;
    printf("-----    E    -----\n");
    printf("> *p=%d\n\n",*p);
    printf("printf(\"> ++(*p)=%%d\\n\",++(*p));\n");
    printf("> ++(*p)=%d\n",++(*p));//> ++(*p)=11,先值自增1,后傳值,類比++a
    printf("\n");
    printf("printf(\"> *p=%%d\\n\",*p);\n");
    printf("> *p=%d\n",*p);//> *p=11
    printf("\n");
}

void F(int array[3])
{
    int *p = NULL;
    p = array;
    printf("-----    F    -----\n");
    printf("> *p=%d\n\n",*p);
    printf("printf(\"> *++p=%%d\\n\",*++p);\n");
    printf("> *++p=%d\n",*++p);//> *++p=20,先地址自增1,后傳值
    printf("\n");
    printf("printf(\"> *p=%%d\\n\",*p);\n");
    printf("> *p=%d\n",*p);//> *p=20
    printf("\n");
}

void G(int array[3])
{
    int *p = NULL;
    p = array;
    printf("-----    G    -----\n");
    printf("> *p=%d\n\n",*p);
    printf("printf(\"> *(++p)=%%d\\n\",*(++p));\n");
    printf("> *(++p)=%d\n",*(++p));//> *(++p)=20,先地址自增1,后傳值
    printf("\n");
    printf("printf(\"> *p=%%d\\n\",*p);\n");
    printf("> *p=%d\n",*p);//> *p=20
    printf("\n");
}

int main(void)
{
    int a[3]={10,20,30},b[3]={10,20,30},c[3]={10,20,30},d[3]={10,20,30},e[3]={10,20,30},f[3]={10,20,30},g[3]={10,20,30};
    printf("array[3]={10,20,30}\np=array\n\n");
    A(a); // (*p)++  先傳值,后值自增1,類比a++
    B(b); // *p++ == *(p++)  先傳值,后地址自增1
    C(c); // *(p++) == *p++  先傳值,后地址自增1
    D(d); // ++*p == ++(*p)  先值自增1,后傳值
    E(e); // ++(*p) == ++*p  先值自增1,后傳值,類比++a
    F(f); // *++p == *(++p)  先地址自增1,后傳值
    G(g); // *(++p) == *++p  先地址自增1,后傳值
    printf("\n>> A ---> (*p)++,先傳值,后值自增1,類比a++\n>> B==C ---> *p++ == *(p++),先傳值,后地址自增1\n>> D==E ---> ++*p == ++(*p),先值自增1,后傳值,類比++a\n>> F==G ---> *++p == *(++p),先地址自增1,后傳值\n");
    return 0;
}

執行結果

array[3]={10,20,30}
p=array

-----    A    -----
> *p=10

printf("> (*p)++=%d\n",(*p)++);
> (*p)++=10

printf("> *p=%d\n",*p);
> *p=11

-----    B    -----
> *p=10

printf("> *p++=%d\n",*p++);
> *p++=10

*printf("> *p=%d\n",*p);
> *p=20

-----    C    -----
> *p=10

printf("> *(p++)=%d\n",*(p++));
> *(p++)=10

printf("> *p=%d\n",*p);
> *p=20

-----    D    -----
> *p=10

printf("> ++*p=%d\n",++*p);
> ++*p=11

printf("> *p=%d\n",*p);
> *p=11

-----    E    -----
> *p=10

printf("> ++(*p)=%d\n",++(*p));
> ++(*p)=11

printf("> *p=%d\n",*p);
> *p=11

-----    F    -----
> *p=10

printf("> *++p=%d\n",*++p);
> *++p=20

printf("> *p=%d\n",*p);
> *p=20

-----    G    -----
> *p=10

printf("> *(++p)=%d\n",*(++p));
> *(++p)=20

printf("> *p=%d\n",*p);
> *p=20


>> A ---> (*p)++,先傳值,后值自增1,類比a++
>> B==C ---> *p++ == *(p++),先傳值,后地址自增1
>> D==E ---> ++*p == ++(*p),先值自增1,后傳值,類比++a
>> F==G ---> *++p == *(++p),先地址自增1,后傳值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM