当前位置:   article > 正文

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

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. &+数组名,取出的是数组的地址。&+数组名,数组名表示整个数组。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/620275
推荐阅读
相关标签
  

闽ICP备14008679号