• 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	%d
    ", *(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 :
    ");
        for(i=0; i< 3; i++)
        {    for(j=0; j< 3; j++)
                printf("%d	", b[i][j]);
            printf("
    ");
        }
        printf("%d	%d	%d
    ", *(*(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

  • 相关阅读:
    机器学习(Machine Learning)&深入学习(Deep Learning)资料
    漫谈 机器学习
    Android 屏幕滑动事件
    Andriod中绘(画)图----Canvas的使用详解
    android studio上代码编译调试中遇到的一些异常记录
    Android签名详解(debug和release)
    如何用AndroidStudio导入github项目
    java synchronized详解
    视频编解码学习之一:理论基础
    Android 环境下编译FFmpeg
  • 原文地址:https://www.cnblogs.com/kuangsyx/p/7496454.html
Copyright © 2020-2023  润新知