• C【数组】


    1.一维数组

    1.1 数组的创建

    1.2 数组的初始化

    1.3 一维数组的使用

    1. int main()
    2. {
    3. // char arr[] = "abcdef";//[a][b][c][d][e][f][\0]
    4. // //printf("%c\n", arr[3]);//d
    5. // int i = 0;
    6. // int len = strlen(arr);
    7. // for(i=0; i
    8. // {
    9. // printf("%c ", arr[i]);
    10. // }
    11. int arr[] = {1,2,3,4,5,6,7,8,9,0};
    12. int sz = sizeof(arr)/sizeof(arr[0]);
    13. int i = 0;//下标
    14. for(i=0; i
    15. {
    16. printf("%d ", arr[i]);
    17. }
    18. return 0;
    19. }

    int arr[10];

    int sz = sizeof(arr)/sizeof(arr[0]);

    1.4 一维数组在内存中的存储

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

    2.二维数组

    2.1 二维数组的创建

    1. //数组创建
    2. int arr[3][4];
    3. char arr[3][5];
    4. double arr[2][4];

    2.2 二维数组的初始化

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

    2.3 二维数组的使用

    1. int main()
    2. {
    3. int arr[3][4] = {{1,2,3},{4,5}};
    4. //1 2 3 0
    5. //4 5 0 0
    6. //0 0 0 0
    7. int i = 0;
    8. for(i=0; i<3; i++)
    9. {
    10. int j = 0;
    11. for(j=0; j<4; j++)
    12. {
    13. printf("%d ", arr[i][j]);
    14. }
    15. printf("\n");
    16. }
    17. //char ch[5][6];
    18. //int arr[] = {1,2,3,4};
    19. //int arr[][4] = {{1,2,3,4},{5,6,7,8}};
    20. return 0;
    21. }

    2.4 二维数组在内存中的存储

    像一维数组一样,这里我们尝试打印二维数组的每个元素。

    1. #include
    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. }

    3. sizeof和strlen

    2. strlen 是求字符串长度的-只能针对字符串求长度 - 库函数-使用得引头文件,求'\n'之前的个数
    3. sizeof 计算变量、数组、类型的大小-单位是字节 - 操作符

    1. int main()
    2. {
    3. //创建一个数组-存放整型-10个
    4. //int arr[10] = {1,2,3};//不完全初始化,剩下的元素默认初始化为0
    5. //char arr2[5] = {'a', 98};
    6. //char arr3[5] = "ab";//ok
    7. char arr4[] = "abcdef";
    8. printf("%d\n" , sizeof(arr4));//
    9. //sizeof 计算 arr4所占空间的大小
    10. //7个元素-char 7*1 = 7
    11. printf("%d\n" , strlen(arr4));//
    12. //strlen 求字符串的长度-'\0'之前的字符个数
    13. //[a b c d e f \0]
    14. //6
    15. //int n = 5;
    16. //char ch[n];//err
    17. return 0;
    18. }
    19. //1. strlen 和 sizeof没有什么关联
    20. //2. strlen 是求字符串长度的-只能针对字符串求长度 - 库函数-使用得引头文件,求'\n'之前的个数
    21. //3. sizeof 计算变量、数组、类型的大小-单位是字节 - 操作符
    22. int main()
    23. {
    24. char arr1[] = "abc";
    25. char arr2[] = {'a', 'b', 'c'};
    26. printf("%d\n", sizeof(arr1));//4
    27. printf("%d\n", sizeof(arr2));//3
    28. printf("%d\n", strlen(arr1));//3
    29. printf("%d\n", strlen(arr2));//因为strlen要读取到'\0'才停下来,所以是生成随机值
    30. return 0;
    31. }

    4.数组越界

    1. #include
    2. int main()
    3. {
    4. int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    5. int i = 0;
    6. for(i=0; i<=10; i++)
    7. {
    8. printf("%d\n", arr[i]);//当i等于10的时候,越界访问了
    9. }
    10. return 0;
    11. }

    5. 数组作为函数参数

    5.1 冒泡排序函数的错误设计

    1. //方法1:
    2. #include
    3. void bubble_sort(int arr[])
    4. {
    5. int sz = sizeof(arr)/sizeof(arr[0]);//这样对吗?
    6. int i = 0;
    7. for(i=0; i-1; i++)
    8. {
    9. int j = 0;
    10. for(j=0; j-1; j++)
    11. {
    12. if(arr[j] > arr[j+1])
    13. {
    14. int tmp = arr[j];
    15. arr[j] = arr[j+1];
    16. arr[j+1] = tmp;
    17. }
    18. }
    19. }
    20. }
    21. int main()
    22. {
    23. int arr[] = {3,1,7,5,8,9,0,2,4,6};
    24. bubble_sort(arr);//是否可以正常排序?
    25. for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
    26. {
    27. printf("%d ", arr[i]);
    28. }
    29. return 0;
    30. }

    出问题,那我们找一下问题,调试之后可以看到 bubble_sort 函数内部的 sz ,是1。 难道数组作为函数参数的时候,不是把整个数组的传递过去?

    5.2 数组名是什么?

    1. #include
    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. int arr[10] = {0};
    2. printf("%d\n", sizeof(arr));//40

    补充:

    1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数 组。

    2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

    5.3 冒泡排序函数的正确设计

    当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。 所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。 那么,函数内部的 sizeof(arr) 结果是4。

    1. //方法2
    2. void bubble_sort(int arr[], int sz)//参数接收数组元素个数
    3. {
    4. //代码同上面函数
    5. }
    6. int main()
    7. {
    8. int arr[] = {3,1,7,5,8,9,0,2,4,6};
    9. int sz = sizeof(arr)/sizeof(arr[0]);
    10. bubble_sort(arr, sz);//是否可以正常排序?
    11. for(i=0; i
    12. {
    13. printf("%d ", arr[i]);
    14. }
    15. return 0;
    16. }

    作业

    实现函数init(),初始化数组全为0

    1. void Init(int arr[], int sz)
    2. {
    3. int i = 0;
    4. for (i = 0; i < sz; i++)
    5. {
    6. arr[i] = 0;
    7. }
    8. }
    9. int main()
    10. {
    11. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    12. int sz = sizeof(arr) / sizeof(arr[0]);
    13. Init(arr, sz);//把数组初始化0
    14. return 0;
    15. }

    实现printf(),打印数组的每一个元素

    1. void Print(int arr[], int sz)
    2. {
    3. int i = 0;
    4. for (i = 0; i < sz; i++)
    5. {
    6. printf("%d ", arr[i]);
    7. }
    8. printf("\n");
    9. }
    10. int main()
    11. {
    12. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    13. int sz = sizeof(arr) / sizeof(arr[0]);
    14. Print(arr, sz);//打印
    15. return 0;
    16. }

    实现reverse()函数完成数组元素的逆置

    1. void Reverse(int arr[], int sz)
    2. {
    3. int left = 0;
    4. int right = sz - 1;
    5. while (left
    6. {
    7. int tmp = arr[left];
    8. arr[left] = arr[right];
    9. arr[right] = tmp;
    10. left++;
    11. right--;
    12. }
    13. }
    14. int main()
    15. {
    16. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    17. int sz = sizeof(arr) / sizeof(arr[0]);
    18. Reverse(arr, sz);
    19. return 0;
    20. }

    将数组A中的内容和数组B中的内容进行交换

    1. //将数组A中的内容和数组B中的内容进行交换
    2. int main()
    3. {
    4. int arr1[] = { 1, 3, 5, 7, 9 };
    5. int arr2[] = { 2, 4, 6, 8, 0 };
    6. int tmp = 0;
    7. int i = 0;
    8. int sz = sizeof(arr1) / sizeof(arr1[0]);
    9. for (i = 0; i < sz; i++)
    10. {
    11. tmp = arr1[i];
    12. arr1[i] = arr2[i];
    13. arr2[i] = tmp;
    14. }
    15. }

  • 相关阅读:
    分享几个常用的国外英文论文文献数据库,先收藏再说
    使用axis调用WebService,Java WebService调用工具类
    C++提高篇:深入理解纯虚函数和抽象类
    ping github.com 显示 Request timeout for icmp_seq 0 问题
    写给Java/Android开发者的Python入门教程
    【ESP32调试-快速入门】
    2022高教社杯思路汇总A题B题C题D题
    【经验】通过跳板机远程连接内网服务器的相关配置
    AttitudeFactor.h/AttitudeFactor.cpp
    docker基础篇:安装redis单机版
  • 原文地址:https://blog.csdn.net/m0_63077733/article/details/132898493