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

 

posted @ 2017-09-10 09:02  大鱼海棠兮  阅读(14630)  评论(0编辑  收藏  举报