C語言中指針*p[N], (*P)[N],及**p的區別


在C語言編程中指針經常困擾着我們,但是若能靈活運用指針的話,將會使得我們編程變得更加輕松與高效。這里講下*p[N], (*P)[N],及**p的區別,這也是之前經常困擾我的地方。

這三者的定義分別為:

int  *p[N]表示指針數組,也就是說定義了N個不同指向int型的指針。

int (*p)[N]表示定義一個指針,指向一個int[N]型的指針。

int **p 表示定義一個指向指針的指針。

注意[]的優先級要高於*。

指針即表示一個存放某種數據類型變量的地址,例如:

#include <stdio.h>
#include <math.h>

int main()
{
    int *p, i;
    int a[3];
    p = a;
    for(i=0; i<3; i++)
        a[i] = i;
    printf("%d\t%d\n", *(p+1), a[1]);
   return 1; }

這里p存儲的是數組a的首地址,且為int類型,那么p+1表示p向后移動一個int型的字節得到的地址,也就是a[1]的地址。

上述結果即為:

1   1

下面通過一些例子來說明這些指針*p[N], *p[N]和**p的區別。

#include <stdio.h>

int main(int argc, char* argv[])
{
    int i, j;
    int (*p1)[3], *p2[3], **p3;
    int b[3][3];
    
    for(i=0; i<3; i++ )
        for(j=0; j< 3; j++)
            b[i][j] = 2*i + j;
    p1 = b;
    for(i=0; i< 3; i++)
        p2[i] = b[i];

    p3 = malloc(3 * sizeof(*p3));
    for(i=0; i< 3; i++)
        *(p3+i) =b[i]; 
    printf("the matrix is :\n");
    for(i=0; i< 3; i++)
    {    for(j=0; j< 3; j++)
            printf("%d\t", b[i][j]);
        printf("\n");
    }
    printf("%d\t%d\t%d\n", *(*(p1+1)+1), *(p2[1]+1), *(*(p3+1)+1));
}

解釋說明:

  *p[3]表示一個指針數組,可以理解為定義了三個指針*p1[0], *p1[1], *p[2],在該例子中分別將b[0]的地址賦值給p[0],b[1]的地址賦值給p[2],...,因此*(p2[1]+1)表示的是*(b[1]+1)的值,也就是b[1][1].

       **p表示一個指向指針的指針,也可以理解為p存儲的是一個地址的地址。比如在該例子中,{b[0], b[1], b[2]}可以認為是一個數組,里面的元素為一個地址,p存儲的是該數組的初始地址,也就是說*p指向的是該數組的第一個元素(*(p+1)表示這個數組的第二個元素),但注意到這第一個元素還是一個地址,其相當數組b[0]的首地址,因此*(*(p3+1)+1)相當於*(b[1]+1),也就是b[1][1]

        (*p)[3]改變了自然的運算符的優先級,相當於(int)((*p)[3])。一有指針就頭疼,我們把指針先替換掉,就是int a[n],是一個n維數組,數組首地址(也就是數組名)是a。那么,int (*p)[n]也是一個n維數組,但是這個數組的首地址是*p,也就是說,p指向的內容,是一個數組的首地址。那么,p就是指向一個數組的指針,這個數組中的元素都是int。實際上,p3相當於一個二重指針,這個和**p其實差不多。

 

以上是我關於指針的一些個人理解,若有錯誤之處,希望廣大網友指出,

 

參考博文:http://blog.csdn.net/ywb201314/article/details/52062059

 


免責聲明!

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



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