• 数组指针和指针数组


    指针数组与数组指针

    数组指针(指针)

    定义 int (*p)[n];
    ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

    #include <stdio.h>
    int main()
    
    {
    //一维数组
    
    int a[5] = { 1, 2, 3, 4, 5 };
    
    //步长为5的数组指针,即数组里有5个元素
    
    int (*p)[5];
    
    //把数组a的地址赋给p,则p为数组a的地址,则*p表示数组a本身
    
    p = &a;
    
    //%p输出地址, %d输出十进制
    
    //
    回车
    
    //在C中,在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型。
    
    printf("%p
    ", a); //输出数组名,一般用数组的首元素地址来标识一个数组,则输出数组首元素地址
    
    printf("%p
    ", p); //根据上面,p为数组a的地址,输出数组a的地址
    
    printf("%p
    ", *p); //*p表示数组a本身,一般用数组的首元素地址来标识一个数组
    
    printf("%p
    ", &a[0]); //a[0]的地址
    
    printf("%p
    ", &a[1]); //a[1]的地址
    
    printf("%p
    ", p[0]); //数组首元素的地址
    
    printf("%d
    ", **p); //*p为数组a本身,即为数组a首元素地址,则*(*p)为值,当*p为数组首元素地址时,**p表示首元素的值1
    
    printf("%d
    ", *p[0]); //根据优先级,p[0] 表示首元素地址,则*p[0]表示首元素本身,即首元素的值1
    
    printf("%d
    ", *p[1]); //为一个绝对值很大的负数,不表示a[1]...表示什么我还不知道
    
    
    
    
    //将二维数组赋给指针
    
    int b[3][4];
    
    int(*pp)[4]; //定义一个数组指针,指向含4个元素的一维数组
    
    pp = b; //将该二维数组的首地址赋给pp,也就是b[0]或&b[0],二维数组中pp=b和pp=&b[0]是等价的
    
    pp++; //pp=pp+1,该语句执行过后pp的指向从行b[0][]变为了行b[1][],pp=&b[1]
    
    
    int k;
    
    scanf_s("%d", &k);
    
    return 0;
    
    }
    

    所以数组指针也称指向一维数组的指针,亦称行指针。

    指针数组(数组)

    定义 int p[n];
    []优先级高,先与p结合成为一个数组,再由int
    说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
    如要将二维数组赋给一指针数组:

    #include <stdio.h>
    int main()
    {
    
    int a = 1;
    int b = 2;
    int *p[2];
    p[0] = &a;
    p[1] = &b;
    
    
    printf("%p
    ", p[0]); //a的地址
    
    printf("%p
    ", &a); //a的地址
    
    printf("%p
    ", p[1]); //b的地址
    
    printf("%p
    ", &b); //b的地址
    
    printf("%d
    ", *p[0]); //p[0]表示a的地址,则*p[0]表示a的值
    
    printf("%d
    ", *p[1]); //p[1]表示b的地址,则*p[1]表示b的值
    
    
    //将二维数组赋给指针数组
    
    int *pp[3]; //一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值
    
    int c[3][4];
    
    for (int i = 0; i<3; i++)
    
    	pp[i] = c[i];
    
    
    int k;
    
    scanf_s("%d", &k);
    
    return 0;
    
    }
    

    还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
    比如要表示数组中i行j列一个元素:

    *(p[i]+j)
    *(*(p+i)+j)
    (*(p+i))[j]、p[i][j]
    

    优先级:()>[]>*

  • 相关阅读:
    质量属性分析之《淘宝网》
    每日总结(3.7)
    每日总结(3.6)
    读架构漫谈有感
    每日总结(3.5)
    每日总结(3.4)
    laravel 输出时间少了8小时
    laravel 循环添加新的数据之后如何排序
    php trait使用详解
    laravel Guzzle使用
  • 原文地址:https://www.cnblogs.com/zw431387/p/10279658.html
Copyright © 2020-2023  润新知