• c语言,数组和指针


    概要:

    1.普通数组与指针

    2.数组指针

    3.指针的数组

    数组是一个由(同一类型)连续元素组成的预先分配的内存块;指针是一个对任何位置的元素的引用。

    数组自动分配空间,但不能重分配或改变大小;指针必须被赋值以指向分配的空间,可以随意重新赋值。

    指针可以模拟数组;几乎没有所谓数组的东西,实际是个指针操作符。

    1.普通数组和指针

    #include <stdio.h>
    
    int main()
    {
    
        int arry[10];
        int *p=arry;
        arry[1]=100;
        printf("arry[1]=%d,p[1]=%d 
    ",arry[1],p[1]);
        
        return 0;
    }
    /*
    root@oucaijun:/work/dcc# gcc *.c; ./a.out
    arry[1]=100,p[1]=100 
    */
    

      

    2.数组指针

    为什么数组的指针在声明时一定说明数组最后一个维度的大小呢?答案很简单。

    数组指针虽然是一种指向指针的指针,但是,既然我们称其为数组指针而不是普通的指向指针的指针,就是因为他们之间有一个根本性的区别。

    普通指向指针的指针,在类型信息描述中,包含的是其指向的指针变量占用的空间(也就是说,恒为2);

    而数组指针在类型信息里面包含了数组的大小信息(在多维数组指针中,可以忽略前面各个维度的大小,但是不能忽略最后一个维度的大小,在随后的章节中,我们将详细讲解其中的原因)。

    通俗的说:作为一个数组指针,要想与普通的“指向指针的指针”划清界限、标新立异,就必须要包含数组的大小信息,否则就“没有脸面被称之为数组指针”。

    因此,对于一个指向数组的指针来说,要想证明自己是一个真正的“数组指针”而不是普通的“指向指针的指针”,就必须拥有数组大小“这一关文凭'。而且,这一“文凭”在数组指针参与sizeof()运算时还要出具。如果sizeof()发现其出具的文凭等级不够,编译器会报告错误。

    #include <stdio.h>
    
    int main()
    {
    
        int i, j;
        int arry[2][3]={ {11,12,13}, {21,22,23}};	
    
        int (*q)[][3]=&arry; //q是一个指针,该指针指向一个x*3二维数组,数组内的数据元素是int。
        int (*p)[2][3]=&arry; //p是一个指针,该指针指向一个2*3二维数组,数组内的数据元素是int。
        
        //printf("sizeof(*q)=%d
    ",sizeof(*q)); // error: invalid application of ‘sizeof’ to incomplete type ‘int[][3]’
        printf("sizeof(*p)=%d
    ",sizeof(*p)); 
        printf("sizeof(arry)=%d
    ",sizeof(arry)); 
           
        for(i = 0; i < 2; i++ ){
            for(j = 0; j < 3; j++ ){
                printf("arry[%d][%d] = %d
    ", i, j, arry[i][j]);
            }
        }
        
        for(i = 0; i < 2; i++ ){
            for(j = 0; j < 3; j++ ){
                printf("(*q)[%d][%d] = %d
    ", i, j, (*q)[i][j]);
            }
        }
        
        for(i = 0; i < 2; i++ ){
            for(j = 0; j < 3; j++ ){
                printf("(*p)[%d][%d] = %d
    ", i, j, (*p)[i][j]);
            }
        }
        
        return 0;
    }
    /*
    root@oucaijun:/work/dcc# gcc *.c; ./a.out
    sizeof(*p)=24
    sizeof(arry)=24
    arry[0][0] = 11
    arry[0][1] = 12
    arry[0][2] = 13
    arry[1][0] = 21
    arry[1][1] = 22
    arry[1][2] = 23
    (*q)[0][0] = 11
    (*q)[0][1] = 12
    (*q)[0][2] = 13
    (*q)[1][0] = 21
    (*q)[1][1] = 22
    (*q)[1][2] = 23
    (*p)[0][0] = 11
    (*p)[0][1] = 12
    (*p)[0][2] = 13
    (*p)[1][0] = 21
    (*p)[1][1] = 22
    (*p)[1][2] = 23
    */
    

      

    3.指针的数组

    这个没甚么特别的。

  • 相关阅读:
    微前端开发常见问题汇总
    什么是UUId?理解UUId的五个版本和使用
    前端实现.md文件转换成.html文件
    使用HTML5 SVG 标签
    小程序开发中遇到的问题
    Django REST framework+Vue 打造生鲜超市(十一)
    Django REST framework+Vue 打造生鲜超市(十)
    Django REST framework+Vue 打造生鲜超市(九)
    Django REST framework+Vue 打造生鲜超市(八)
    Django REST framework+Vue 打造生鲜超市(七)
  • 原文地址:https://www.cnblogs.com/mylinux/p/4668216.html
Copyright © 2020-2023  润新知