• C基础-数组


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

    1. int main()
    2. {
    3. // int arr1[10];
    4. int n = 0;
    5. scanf("%d",&n);
    6. //int count = 10;
    7. int arr2[n]; //局部的变量,这些局部的变量或者数组是存放在栈区的,存放在栈区上的数组,如果不初始化的话,默认是随机值
    8. // VS2019 VS2022 这样的IDE 不支持C99种的变长数组
    9. //C99 标准之前,数组的大小只能是常量表达式
    10. //C99 标准中引入了:变长数组的概念,使得数组在创建的时候可以使用变量,但是这样的数组不能初始化
    11. int i = 0;
    12. for(i=0;i
    13. {
    14. printf("%d\n", arr2[i]);
    15. }
    16. // char arr3[10];
    17. // float arrt[10];
    18. // double arr5[20];
    19. return 0;
    20. }
    21. //数组的初始化
    22. //数组的初始化上指,在创建数组的同时给数组的内容一些合理初始值(初始化)
    23. int main()
    24. {
    25. // int arr1[10] = {1,2,3,4,5,6,7,8,9,10}; //完全初始化
    26. // int arr2[10] = {1,2,3}; //不完全初始化
    27. // int arr4[10] = {0};//不完全初始化,剩余的元素默认都是0
    28. // int arr3[] = {}; //省略数组大小,数组必须初始化,数组的大小上根据初始化内容来定的
    29. // int arr5[] = {1,2,3};
    30. // //int arr6[]; //err
    31. char arr[] = "abc"; // a b c \0
    32. char arr2[] = {'a','b','c'}; // a b c
    33. char arr3[] = {'a',98,'c'}; // a 98=b c
    34. return 0;
    35. }

    2.一维数组的使用

    1. int main()
    2. {
    3. int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    4. // 0,1,2,3,4,5,6,7,8,9
    5. //printf("%d\n",arr[5]); //[]下标引用操作符
    6. //printf("%d\n",arr[0]); //[]下标引用操作符
    7. int i = 0;
    8. int sz = sizeof(arr) / sizeof(arr[0]); //计算数组大小
    9. for(i = 0;i
    10. {
    11. scanf("%d",&arr[i]);
    12. }
    13. for(i = 0;i
    14. //for(i=0;i < sz;i += 2)
    15. //for(i = sz; i>=0; i--)
    16. {
    17. printf("%d\n",arr[i]);
    18. }
    19. return 0;
    20. }
    21. int main()
    22. {
    23. int arr[10] = {}; //10 * 4
    24. printf("%d\n",sizeof(arr)); //40-计算的是数组的总大小,单位是字节
    25. printf("%d\n",sizeof(arr[0])); //4
    26. int sz = sizeof(arr) / sizeof(arr[0]); //计算数组元素个数的方法
    27. printf("%d\n",sz);
    28. return 0;
    29. }

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

    1. //一维数组在内存中存储
    2. int main()
    3. {
    4. int arr[10] = {1,2,3,4,5};
    5. int sz = sizeof(arr) / sizeof(arr[0]);
    6. int i =0;
    7. for(i = 0;i < sz;i++)
    8. {
    9. printf("&arr[%d] = %p\n",i,&arr[i]);
    10. }
    11. return 0;
    12. }

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

    1. //二维数组
    2. // int main()
    3. // {
    4. // //数组创建
    5. // int arr[3][4]; //3行4列数组
    6. // char ch[3][8];
    7. // //数组初始化
    8. // int arr1[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
    9. // int arr2[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};//每一行放满,再放剩下的
    10. // //二维数组初始化,行可以省略,但是列不能省略
    11. // int arr3[3][4] = {{1,2,3},2,3,4,5,3,4,5,6};
    12. // //printf("%d\n",&arr[0]);
    13. // return 0;
    14. // }

    5.二维数组的使用

    1. int main()
    2. {
    3. int arr[4][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9}};
    4. //二维数组的行和列都是从0开始的
    5. //printf("%d\n", arr[2][3]); //6
    6. int i = 0;
    7. //行号
    8. for(i = 0;i<4;i++)
    9. {
    10. int j= 0;
    11. for(j = 0;j<5; j++)
    12. {
    13. printf("%d ",arr[i][j]); // 0 1 2 3 4
    14. }
    15. printf("\n");
    16. }
    17. return 0;
    18. }

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

    1. //二维数组在内存中的存储
    2. int main()
    3. {
    4. int arr[4][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9}};
    5. //二维数组的行和列都是从0开始的
    6. //printf("%d\n", arr[2][3]); //6
    7. int i = 0;
    8. //行号
    9. for(i = 0;i<4;i++)
    10. {
    11. int j= 0;
    12. for(j = 0;j<5; j++)
    13. {
    14. //printf("%d ",arr[i][j]); // 0 1 2 3 4
    15. printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]); //二维数组在内存中也是连续存放的
    16. }
    17. printf("\n");
    18. }
    19. return 0;
    20. }

    7.数组越界

    数组的下标是有范围限制的

    数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1

    所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问

    C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,我们自己要做好越界的检查

    1. //数组越界
    2. //二维数组的行和列有可能也会越界
    3. int main()
    4. {
    5. int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    6. int i = 0;
    7. for(i=0;i<=10;i++) //1 2 3 4 5 6 7 8 9 10 1213399056 % 越界访问
    8. //for(i=0;i<10;i++) //1,2,3,4,5,6,7,8,9,10
    9. {
    10. printf("%d ",arr[i]);
    11. }
    12. return 0;
    13. }

    8.数组作为函数参数

    我们会将数组作为参数传个函数,比如我们实现一个冒泡排序

    1. //数组作为函数参数
    2. //输入10个整数,对这组数进行排序
    3. //排序方法: 冒泡排序,选择排序,插入排序,快速排序
    4. //void bubble_sort(int arr[10],int sz) //这里的arr的本质是指针变量
    5. void bubble_sort(int* arr,int sz)
    6. {
    7. int i = 0;
    8. // 4 / 4 = 1
    9. //int sz = sizeof(arr) / sizeof(arr[0]); // sz = 1
    10. for( i = 0;i < sz-1;i++)
    11. {
    12. int j = 0;
    13. //每一趟开始前就假设已经有序了
    14. int flag = 1;
    15. //一趟每部比较多对数
    16. for(j=0;j-1-i;j++)
    17. {
    18. if (arr[j] > arr[j+1])
    19. {
    20. //交换
    21. int tmp = arr[j];
    22. arr[j] = arr[j+1];
    23. arr[j + 1] = tmp;
    24. flag = 0;
    25. }
    26. }
    27. if(flag == 1)
    28. {
    29. break;
    30. }
    31. }
    32. }
    33. int main()
    34. {
    35. int arr[10] = {0};
    36. //输入
    37. int i = 0;
    38. int sz = sizeof(arr) / sizeof(arr[0]);
    39. for(i = 0;i< sz; i++)
    40. {
    41. scanf("%d",&arr[i]);
    42. }
    43. //冒泡排序 - 两两相邻的元素尽量比较
    44. //排序-升序
    45. //让这个函数来完成数组arr中数据的排序
    46. bubble_sort(arr,sz); //arr 是数组首元素的地址
    47. //arr作为数组传参,传递的是地址
    48. //趟数
    49. // for( i = 0;i < sz-1;i++)
    50. // {
    51. // int j = 0;
    52. // //一趟每部比较多对数
    53. // for(j=0;j
    54. // {
    55. // if (arr[j] > arr[j+1])
    56. // {
    57. // //交换
    58. // int tmp = arr[j];
    59. // arr[j] = arr[j+1];
    60. // arr[j + 1] = tmp;
    61. // }
    62. // }
    63. // }
    64. //输出
    65. for( i = 0; i < sz;i++)
    66. {
    67. printf("%d ",arr[i]);
    68. }
    69. return 0;
    70. }
    71. //数组名该怎么理解?
    72. //数组名通常情况下就是数组首元素的地址
    73. //但是有2个例外 1.sizeof(数组名),数组名单独放在sizeof()内部,这里的数组名表示整个数组,计算的是整个数组的大小
    74. //2. &数组名,这里的数组名也表示整个数组,这里取出的是整个数组的地址
    75. //除此指之外,遇到的数组名都表示数组首元素地址
    76. // int main()
    77. // {
    78. // int arr[10] = {1,2,3,4,5,6};
    79. // printf("%p\n",arr); //0x16b567340
    80. // printf("%p\n",arr+1); //0x16b57f344
    81. // printf("%p\n",&arr[0]); //0x16b567340
    82. // printf("%p\n",&arr[0]+1); //0x16b57f344
    83. // //printf("%d\n",sizeof(arr)); // 40
    84. // printf("%p\n",&arr); //0x16b567340 数组的地址
    85. // printf("%p\n",&arr+1); //0x16b57f368 +1 跳过整个数组
    86. // return 0;
    87. // }

  • 相关阅读:
    天空卫士陆明:数据法在企业如何落地
    导数求函数最大值和最小值习题
    Java面试大厂名企高频真题--03虚拟机篇
    贪心算法java实现
    Java框架 SSM整合
    Redis分布式锁——秒杀超卖
    LayaBox---多状态---时间轴动画
    搭建深度学习环境(Pytorch)
    小程序自定义tabbar,中间凸起
    es6 export和export default的区别
  • 原文地址:https://blog.csdn.net/qq_61658398/article/details/132779664