array 数组- 重置版

x33g5p2x  于2021-11-22 转载在 其他  
字(3.6k)|赞(0)|评价(0)|浏览(394)

一维数组的创建与初始化

  1. 数组是一种相同类型元素的集合

程序一:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. 创建一个数组
  6. int arr1[10];// [常量]
  7. 初始化 int arr[10]={1,2,3};不完全初始化,剩下的元素默认初始化0.
  8. char arr2[5];
  9. 初始化 char arr[5]={'a','b'};,不完全初始化,剩下元素默认初始化0.
  10. 初始化 char arr[5]="ab" 这是可行的,因为隐藏一个'\0',后面的0使我们自己给的(这个字符串都给给它的==),不是系统默认
  11. int n = 5;
  12. char ch[n]; 这样创建数组是错误,因为n还是变量,值是被赋值了,并不会改变它的属性
  13. char arr3[5] = { 'a', 98/*b的ASCII码等于98*/ };//可行
  14. 上式等价于下式
  15. char arr3[5] = {'a','b'}
  16. char arr4[] = "abcd";//加上后面隐藏的'\0',大小为5
  17. 当我们并没有指定大小的时候,它会根据后面的数据,自己给定大小
  18. char arr5[] = "abcdef";
  19. printf("%d\n",sizeof(arr5));// 7 sizeof晕倒'\0',把它算进去,在停止计算
  20. printf("%d\n", strlen(arr5));//6 strlen是遇到'\0'(不包含),就停止计算
  21. char arr6[] = { 'a', 'b','c','\0' };
  22. printf("%d\n",strlen(arr6));//如果没有'\0'结束标志符,它会一直算个数,直到遇到'\0',输出的是一个随机数
  23. printf("%d\n", sizeof(arr6));//没有'\0'它就少算一个就是3
  24. return 0;
  25. }

程序二:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. char arr[] = "abcdef";//元素下标是从0开始
  6. pritnf("%c\n",arr[0]); //arr[0] == a,表示首元素a,输出结果为a
  7. 如果要依次打印字符串所有元素用循环更简单,字符串的 '\0' 是隐藏的,一般是不用打印的
  8. int i = 0;
  9. int len = strlen(arr);// 计算元素个数
  10. for (i = 0; i < len; i++)
  11. {
  12. printf("%c ",arr[i]);// a b c d e f
  13. }
  14. return 0;
  15. }

程序三

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[] = {1,2,3,4,5,6,7,8,9,10};
  5. int sz = sizeof(arr) / sizeof(arr[0]);
  6. // sizeof(数组名)计算的整个数组的字节大小,我们只要再求一个元素的大小就可以了,因为 数组是一群相同类型数据的集合,所以我
  7. // 假设 int a[10]; 数组 a 有 10个 int(4byte) 类型的元素,整个数组的大小就是 4*10 == 40 byte, 数组大小除以数组元素大小,不就是数组元素个数嘛。(40/4 == 10)
  8. int i = 0;
  9. for (i = 0; i < sz; i++)
  10. {
  11. printf("%d ",arr[i]);
  12. printf("&arr[%d]=%p\n",i,&arr[i]);// 打印 数组对应下标元素的地址
  13. }
  14. return 0;
  15. }

程序四(二维数组 - 二维数组 的 列 绝对不能 省略 )

  1. #include<stdio.h>
  2. int main()
  3. {
  4. ///int arr[3][4];//存储一个三行四列的数据 3是行(3个一维数组),4是列
  5. int arr1[3][4] = {1,2,3,4,5};
  6. 假设 数据 是这样存的,在内存是连续存储的12345000.....
  7. 1234
  8. 5000
  9. 0000
  10. int arr2[3][4] = { { 1, 2, 3 } , { 4, 5 } };
  11. 1 2 3 0
  12. 4 5 0 0
  13. 0 0 0 0
  14. 一行的数据 是根据元素加个后面的{ },方便你们去区分,再根据列数确定 一行有多少个元素
  15. int arr3[][4] = { { 1, 2, 3 }, { 4, 5 } };
  16. 1 2 3 0
  17. 4 5 0 0
  18. 二维数组不管行还是列,下标都是从0开始,而且 二维数组的 是可以省略的,它会根据 元素 列的值,来确定行数
  19. int arr4[3][4] = { { 1, 2, 3 }, { 4, 5 } };
  20. int i = 0;
  21. for (i = 0; i < 3; i++)
  22. {
  23. int j = 0;
  24. for (j = 0; j < 4; j++)
  25. {
  26. printf("%d ",arr4[i][j]);1 2 3 0
  27. 4 5 0 0
  28. 0 0 0 0
  29. }
  30. printf("\n");
  31. }
  32. return 0;
  33. }

二维数组在内存中的存储

  1. 在内存中实际存储情况,第一行完了,第二行紧跟在第一行,第三行紧跟在第二行,int a[2][2]={1,2,3,4}, 在内存中存储情况为 1 2 3 4 (小端)
  2. 因为 数组的首元素地址是最小的,后面元素,地址依次增大(大约增大 一个元素的类型的字节大小)

程序一

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[3][4] = { { 1, 2, 3 }, { 4, 5 } };
  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. arr[0][3]和arr[1][0]地址相差4,二维数组与一维数组一样,都连续存储
  13. }
  14. }
  15. return 0;
  16. }

数组作为函数参数,怎么作?

实例:冒泡排序

  1. #include<stdio.h>
  2. void bubble_sort(int arr[],int sz)
  3. {
  4. 确定冒号排序的趟数
  5. int i = 0;
  6. for (i = 0; i < sz - 1; i++)// 排序要排 元素总个数-1,最后一个元素不用排
  7. {
  8. int flag = 1;//假设这一趟的数据已经有序
  9. int j = 0;
  10. for (j = 0; j < sz-1-i; 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. flag = 0;//本趟排序的数据不完全有序
  18. }
  19. }
  20. if (1 == flag)
  21. {
  22. break;
  23. }
  24. }
  25. }
  26. int main()
  27. {
  28. int arr[] = { 0, 8, 7, 6, 5, 4, 3, 2, 1, 9 };
  29. int i = 0;
  30. int sz = sizeof(arr) / sizeof(arr[0]);
  31. bubble_sort(arr,sz);
  32. 对数组arr进行传参,传递的是数组arr首元素的地址
  33. for (i = 0; i < sz; i++)
  34. {
  35. printf("%d ",arr[i]);//0,1,2,3,4,5,6,7,8,9
  36. }
  37. return 0;
  38. }

数组名:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[] = { 1, 2, 3, 4, 5, 6, 7 };//数组随着下标的增长,地址是由低到高变化点
  5. printf("%p\n",arr);
  6. 数组名就是数组首元素地址,是一样的。见附图1
  7. printf("%p\n",&arr[0]);
  8. 但有两个意外
  9. 1.sizeof(数组名) - 数组名表示整个数组 ,计算的是整个数组的大小,单位为字节(byte
  10. int sz = sizeof(arr);
  11. printf("%d\n",sz);// 4(元素大小)* 7(元素个数)== 28,效果见附图 2
  12. 2.&(数组名),数组名代表整个数组,&数组名,取的是整个数组的地址
  13. printf("%p\n", &arr);//表示数组的起始地址,是整个数组的地址
  14. 上下两者的值一样,但 意义完全不同,效果图 见附图 3
  15. printf("%p\n", arr);//首元素的地址
  16. //进一步论证 &arr 和 arr的意义完全不同,不同在哪里
  17. printf("%p\n", &arr+1);//地址增加28字节,一个元素4byte,7个元素28字节,意味着 &arr + 1 跳过一整个数组的元素,指向最后一个元素后面的地址
  18. printf("%p\n", arr+1);//地址增加4字节,意味着 arr +1,跳过一个元素,改地址 arr+1,指向第二个元素
  19. 效果见附图 4
  20. return 0;
  21. }

关于数组名,有兴趣的,可以看看我这篇文章指针和数组试题解析(重置版)
附图1;

附图2:

附图3:

附图4:

本文结束

相关文章