zoukankan      html  css  js  c++  java
  • 指针与二维数组

    二维数组的本质:

    int matrix[3][4];

    int matrix[3][4];  ==> int [4] matrix[3];     令type为int[4];  type int[3]; 说明matrix是一个数组,有3个元素;每一个元素是int [4]类型的;

    实质上int[4]就是一个拥有4个int元素的一维数组。

    事实上,二维数组名称的本质是:二维数组的首地址常量(指针常量);

    指针加1移动的是该指针的指类长度。

    例:double *p;

    p+1  就是移动8字节的长度。

    matrix +1 移动了32B,&matrix[3][4]  + 1移动了8B,(matrix的指类是 double[4],&matrix[3][4]的指类是double);

    c编译器不会对指针指类进行严格检查

    scanf("%lf" , matrix);

    scanf("%lf" ,*matrix); //两个同样是给二维数组第一个元素从键盘赋值。gcc运行&matrix[3][4]时出现警告,而*matrix不会,他们两的类型是完全相同的。。

    &matrix[i][0] => &*(matrix[i] + 0) =>matrix[i];

    matrix[i]就是二维数组第i行首地址。

    二维数组名称,引用二维数组元素的过程:

    matrix[i][j] <=> (*(matrix + i))[j]

    *(mareix + i) 中:

    matrix + i将移动i * sizeof(double[4])字节空间,即,跳跃i行元素!!!!

    然后,*降其阶,是*(matrix)的指类成为double,即,matrix[i]是指针,是下标为i的那一行的首地址,只是,其指类已经变成double!

    (matrix[i])[j] <=> *((matrix[i] + j)

    matrix[i] + j事实上移动了 j +sizeof (double)个字节,即,在行内移动了J个double元素空间!

    *(matrix [i] +j),对其指向的空间引用,实际上引用的就是matrix[i][j]!

    关于&matrix

    因为matrix的类型是double (*)[4],因此,&matrix的指类就是double (*)[4],那么,&matrix + 1应该移动48字节。

    代码检验如下;

    #include <stdio.h>

    int main() {
        int num;
        double array[10];
        double *p;
        double matrix[3][4];
        // double[4] arr[3], *q = arr;    // 这种写法C编译器可能不接受!
        
        printf("%p ", &num);
        p = &array[0];    // <=> p = &(*(array + 0));    <=> p = &*array;
        // <=> p = array;
        printf("p=%p array=%p &array[0]=%p ", p, array, &array[0]);
        // 证明array就是指针,且指类与p是相同的:
        printf("p+1=%p array+1=%p ", p+1, array+1);
        // 指针+1将移动该指针的“指类”长度;因为p的指类是double,
        // 因此,p+1应该移动8B;
        // 实验结果发现,array+1与p+1移动了相同的字节数,那么,可以说明
        // array的指类就是double。
        
        // matrix完全可以看成是一个一维数组的首地址常量:
        // double matrix[3][4]; => double[4] matrix[3];
        // 令double[4]为type(某种数据类型);那么,对matrix的定义可以看成:
        // type matrix[3];
        // 在这个角度看,matrix就是一个一维数组名称;根据前面对一位数组名称
        // 的讨论可知,matrix是一个指针常量,且其指类为type!
        // 更进一步可知:matrix + 1将移动sizeof(type)的长度!
        // 即,sizeof(double[4])
        printf("sizeof(double[4]):%d ", sizeof(double[4]));
        printf("matrix:%p &matrix[0][0]:%p ", matrix, &matrix[0][0]);
        printf("matrix+1:%p &matrix[0][0]+1:%p ", matrix + 1, &matrix[0][0]+1);
        // matrix + 1移动了32B;&matrix[0][0] + 1移动了8B;
        // 说明:指针常量matrix的值与指针表达式&matrix[0][0]的值相同;
        // 但是!这不是两个类型相同的指针,即,指类不同!
        // matrix的指类是double[4];&matrix[0][0]的指类是double!
        // C编译器在处理两个指针时,在不涉及指类操作的情况下,将一视同仁!
        
        // scanf("%lf", &matrix[0][0]);    // 这是给二维数组第一个元素从键盘赋值
        // scanf("%lf", matrix); // 这同样可以完成上述任务!
        // 在此时,C编译器不对指针指类进行严格检查!!!
        // scanf("%lf", *matrix); // 这样的写法将使gcc的警告消失!
        // printf("matrix[0][0]:%lf ", matrix[0][0]);
        // 上述实验证明*matrix与&matrix[0][0]类型是完全相同的!
        printf("*matrix+1:%p &matrix[0][0]+1:%p ", *matrix+1, &matrix[0][0]+1);
        
        printf(" &matrix:%p &matrix+1:%p ", &matrix, &matrix + 1);
        scanf("%lf", &matrix); // 这样的写法将使gcc的警告消失!

        return 0;
    }


  • 相关阅读:
    vue基础指令了解
    django中间件和auth模块
    form组件及cookie和session
    ajax学习相关
    数据库优化查询相关
    Django ORM必会13条之外的查询方法
    Django ORM单表查询必会13条
    Django学习之路05
    Django学习之路04
    Django学习之路03
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/9031972.html
Copyright © 2011-2022 走看看