• C语言系列之指针与数组


    一.欢迎来到我的酒馆

          讨论c语言中,数组。

    二.数组

          数组(Array)是一种数据结构,它相当于一个集合,这个集合里的每一个元素的数据类型都是相同的,如:int arr[];声明了一个整形数组,这个数组名叫做arr,数组的每一个元素的数据类型都是int类型。在内存中,数组的每一个元素都存储在一片连续的内存空间中,这就是说每一个元素的内存地址是相邻的。数组提供了一种简便的方式,它使得我们可以用一个单独的变量名存储和访问多个值。

    #include 
    
    int main(int args, char* argv[]){
    
        int i;
        int arr[6] = {1,2,3,4,5,6};//定义一个整型数组
        int length = sizeof(arr) / sizeof(arr[0]);//获取数组的长度
        
        //使用for循环打印数组
        for(i=0;i<length;i++){
            printf("arr[%d]=%d, The element arr[%d] memmory address is: %x\n",i,arr[i],i,&arr[i]);
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出:

    arr[0]=1, The element arr[0] memmory address is: 61fe00
    arr[1]=2, The element arr[1] memmory address is: 61fe04
    arr[2]=3, The element arr[2] memmory address is: 61fe08
    arr[3]=4, The element arr[3] memmory address is: 61fe0c
    arr[4]=5, The element arr[4] memmory address is: 61fe10
    arr[5]=6, The element arr[5] memmory address is: 61fe14
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

          可以看到arr[0]的内存地址是:61fe00,arr[1]的内存地址是:61fe04,arr[2]的内存地址是:61fe08,内存地址是相邻的,而且每次增加4,所以每一个元素的长度是4,也就是4个字节。

    int arr[6] = {1,2,3,4,5,6};
    
    • 1

    当程序运行的时候,操作系统会分配一块内存空间,这块内存空间分给数组arr的长度为:sizeof(arr),也就是24个字节。因为变量arr是局部变量,因此它会存储在栈内存(Stack)中。
    下面用一张图表示数组arr在内存中的分布情况:

    在这里插入图片描述

          其实,不用数组,直接用变量也可以达到相同的效果:

    #include 
    
    int main(int args,char* argv[]){
    
        //使用变量模拟数组的效果
    	int one = 1;
    	int two = 2;
    	int three = 3;
    	int four = 4;
    	int five = 5;
    	int six = 6;
    
        printf("value of one: \t%d, memory address of one: \t%x\n",one,&one);
        printf("value of two: \t%d, memory address of two: \t%x\n",two,&two);
        printf("value of three:\t%d, memory address of three: \t%x\n",three,&three);
        printf("value of four: \t%d, memory address of four: \t%x\n",four,&four);
        printf("value of five: \t%d, memory address of five: \t%x\n",five,&five);
        printf("value of six: \t%d, memory address of six: \t%x\n",six,&six);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    输出:

    value of one:   1, memory address of one:       61fdfc
    value of two:   2, memory address of two:       61fdf8
    value of three: 3, memory address of three:     61fdf4
    value of four:  4, memory address of four:      61fdf0
    value of five:  5, memory address of five:      61fdec
    value of six:   6, memory address of six:       61fde8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

          可以看到内存地址的间隔是4,而int类型的变量长度也为4个字节,因为我们连续定义了6个变量,所以在内存空间中内存地址是相邻的。虽然这样也能达到数组的效果,但相对数组来说不够简洁,访问每个变量需要挨个写,而且这些变量的数据类型都是相同的。于是,数组出现了,使用一个变量名就可以操作所有的元素,非常方便。

          "[]"称为数组索引操作符(Array index operator),也称数组下标(Subscript)。这个操作符通常与数组一起使用,用来检索和操作数组的元素。数组是一种最简单的数据结构,我们可以使用下标(Index)来随机访问数组的元素。在c语言中,数组可以存储int,char,double,float等基本数据类型,我们可以通过不同的方式来描述数组,声明一个数组也非常的简单,如下:

    #include 
    
    int main(int args,char* argv[]){
        
        char array[11] = {'I',' ','l','o','v','e',' ','y','o','u','!'};
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
          关于数组,你需要知道:

    • 数组的索引((index)从0开始
    • 数组的长度决定了它可以存储多少个元素。
    • 数组中的元素可以通过索引(index)来访问。

    三.内存与数组

          数组是一种派生的数据类型,一个数组存储了他所能容纳的元素个数。声明一个数组的时候,就确定了其长度。换句话说,在编译期间,就能确定数组的长度。和普通变量不同的是,数组一次性可以存储多个值。在程序运行时,操作系统会为程序申请一块内存空间,这块内存空间一般是连续的,数组就存储在这块内存空间中。在内存中,数组的每个元素的内存地址是相邻的,数组名称为数组在内存空间中的首地址。

    
    
    • 1
  • 相关阅读:
    布控是什么意思
    Eclipse项目导入笔记大全&踩坑大全
    使用Spark SQL读取阿里云OSS的数据
    grpc 编译
    云台/稳定器/无人机姿态控制之欧拉角与四元数控制优缺点分析
    PostgreSQL manual
    ElasticSearch之Windows中环境安装
    光储直流微电网MATLAB/Simulink仿真
    架构师成神之路总结,你值得拥有,走起
    linux下的文本处理工具awk学习
  • 原文地址:https://blog.csdn.net/StayAlive1887/article/details/133744181