• C语言:数组(超级详细讲解)


    目录

    1. 一维数组的创建和初始化

    1.1数组的创建

    1.2数组的初始化 

    2. 一维数组的使用

    3. 一维数组在内存中的存储

    4. 二维数组的创建和初始化

    5. 二维数组的使用

    6. 二维数组在内存中的存储

    7. 数组越界

    8. 数组作为函数参数


    1. 一维数组的创建和初始化

    1.1数组的创建

    数组是固定大小的序列容器:它们包含按严格线性序列排序的特定数量的元素

    1. //代码1
    2. int arr1[10];
    3. //代码2,在C99标准支持了变长数组,才可以使用
    4. int count = 10;
    5. int arr2[count];
    6. //代码3
    7. char arr3[10];
    8. float arr4[1];
    9. double arr5[20];
    注: 数组创建,在 C99 标准之前,[ ] 中要给一个 常量 才可以,不能使用变量。在 C99 标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

    1.2数组的初始化 

    数组的初始化是指在创建数组的同时给数组的内容一些合理初始值,初始化又分为完全初始化和不完全初始化
    1. //不完全初始化
    2. int arr[10] = { 1,2,3,4 };
    3. int arr1[10];
    4. char arr2[3] = { 'a','b' };
    5. //完全初始化
    6. int arr3[] = { 1,2,3,4 };
    7. int arr4[3] = { 1,2,3 };
    数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确
    定。

    2. 一维数组的使用

    对于数组的使用我们之前介绍了一个操作符: [ ] ,下标引用操作符。它其实就数组访问的操作符
    1. #include <stdio.h>
    2. int main()
    3. {
    4. //数组的不完全初始化
    5. int arr[10];
    6. //计算数组的元素个数
    7. int sz = sizeof(arr) / sizeof(arr[0]);
    8. //对数组内容赋值,数组是使用下标来访问的,下标从0开始
    9. //做下标
    10. int i = 0;
    11. for(i = 0; i < 10; ++i)
    12. {
    13. arr[i] = i;
    14. }
    15. //输出数组的内容
    16. for(i = 0; i < 10; ++i)
    17. {
    18. printf("%d ", arr[i]);
    19. }
    20. return 0;
    21. }

    3. 一维数组在内存中的存储

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int arr[10] = {0};
    5. int i = 0;
    6. int sz = sizeof(arr)/sizeof(arr[0]);
    7.    
    8. for(i=0; i<sz; ++i)
    9. {
    10. printf("&arr[%d] = %p\n", i, &arr[i]);
    11. }
    12. return 0;
    13. }

     随着数组下标的增长,元素的地址,也在有规律的递增。 由此   可以得出结论:一维数组在内存中是连续存放的。

    4. 二维数组的创建和初始化

    1. //数组创建
    2. int arr[3][4];
    3. char arr[3][5];
    4. double arr[2][4];
    5. //数组初始化
    6. int arr[3][4] = {1,2,3,4,5};
    7. int arr[3][4] = {{1,2},{4,5}};
    8. int arr[][4] = {{2,3},{4,5}};
    9. //二维数组如果有初始化,行可以省略,列不能省略

    5. 二维数组的使用

    二维数组的使用也是通过下标的方式
    1. #include <stdio.h>
    2. int main()
    3. {
    4. int arr[3][4] = {0};
    5. int i = 0;
    6. //初始化
    7. for(i=0; i<3; i++)
    8. {
    9. int j = 0;
    10. for(j=0; j<4; j++)
    11. {
    12. arr[i][j] = i*4+j;
    13. }
    14. }
    15. //打印
    16. for(i=0; i<3; i++)
    17. {
    18. int j = 0;
    19. for(j=0; j<4; j++)
    20. {
    21. printf("%d ", arr[i][j]);
    22. }
    23. }
    24. return 0;
    25. }

    6. 二维数组在内存中的存储

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int arr[3][4];
    5. int i = 0;
    6. for(i=0; i<3; i++)
    7. {
    8. int j = 0;
    9. for(j=0; j<4; j++)
    10. {
    11. printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
    12. }
    13. }
    14. return 0;
    15. }

    输出结果是: 

     随着数组下标的增长,元素的地址,也在有规律的递增。 由此   可以得出结论:二数组在内存中是连续存放的。

    7. 数组越界

    数组的下标是有范围限制的。
    数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
    C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就 是正确的,

    8. 数组作为函数参数

    往往我们在写代码的时候,会将数组作为参数传个函数,如下代码(冒泡函数)
    1. #include <stdio.h>
    2. void bubble_sort(int arr[])
    3. {
    4. int sz = sizeof(arr)/sizeof(arr[0]);
    5. int i = 0;
    6. for(i=0; i<sz-1; i++)
    7.   {
    8.        int j = 0;
    9.        for(j=0; j<sz-i-1; j++)
    10.       {
    11.            if(arr[j] > arr[j+1])
    12.           {
    13.                int tmp = arr[j];
    14.                arr[j] = arr[j+1];
    15.                arr[j+1] = tmp;
    16.           }
    17.       }
    18.   }
    19. }
    20. int main()
    21. {
    22.    int arr[] = {3,1,7,5,8,9,0,2,4,6};
    23.    bubble_sort(arr);
    24. //是否可以正常排序
    25.    for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
    26.   {
    27.        printf("%d ", arr[i]);
    28.   }
    29.    return 0;
    30. }

    结果发现无法正常排序 

     我们打开监视窗口,发现sz = 1,他不是应该是10吗,难道数组作为函数参数的时候,不是把整个数组的传递过吗

    由此我们可以看出arr应该是一个指针,那他到底是指向哪里的呢,我们测试一下
    1. #include <stdio.h>
    2. int main()
    3. {
    4.    int arr[10] = {1,23,4,5};
    5. printf("%p\n", arr);
    6.    printf("%p\n", &arr[0]);
    7.    printf("%d\n", *arr);
    8.    //输出结果
    9.    return 0;
    10. }

    由此我们可以知道数组名代表首元素的地址,但是有二个特殊:
    1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数 组。
    2. &+数组名,取出的是数组的地址。&+数组名,数组名表示整个数组。
  • 相关阅读:
    java爬虫使用Jsoup
    PFC(Power Factor Correction)功率因数校正电路
    如何使用数字化系统赋能企业营销?数字化系统对于企业的作用?
    Go语言学习笔记
    MySQL进阶(数据库引擎)——MyISAM和InnoDB引擎的区别
    Dependency ‘org.redisson:redisson:‘ not found解决方法 三种刷新Maven项目的方法
    Learn Prompt- Midjourney Prompt:Prompt 提示语
    S4 image save:save_image_lzo函数分析
    游戏扫码登录+多功能工具箱 微信小程序源码
    前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin
  • 原文地址:https://blog.csdn.net/weixin_74268082/article/details/133202671