当前位置:   article > 正文

c语言 _ 数组 (超详解析 轻松掌握)_数组c语言

数组c语言

目录

1. 数组的创建和初始化

  1.1数组的创建

  1.2 数组的初始化

  1.2.1一维数组的初始化 

  1.2.1二维数组的初始化

2.  数组的一些使用方法

  2.1计算数组大小

  2.2输出数组的全部内容

3. 数组在内存中的存储

4. 数组越界

额外提一提数组名


数组是一组相同类型元素的集合。

1. 数组的创建和初始化

  1.1数组的创建

一维数组的创建

  1.  方法: type name[size]
  2.         类型 命名[大小]
  3.  例:   int arr[10];
  4.           char p[5];
  5.    double a[8];
  6.      注意: 在c语言中不可以进行下面所示的创建方法
  7.   int count = 10;
  8.   int arr2[count];

 数组创建,[ ] 中要给一个常量才可以,不能使用变量。

     二维数组的创建

  1.  方法: type name[size][size]
  2.         类型 命名[大小][大小]
  3.  例:   int arr[10][6]
  4.         char p[5][8]
  5.         double a[8][3]

二维数组由n个一维数组构成,可看作保存数组(一维数组)的数值。

    

  1.2 数组的初始化

  数组的初始化指在创建数组的同时给数组的内容赋上合理的值。

  1.2.1一维数组的初始化 

  1. int arr1[10] = {0,1,2};
  2. int arr2[] = {0,1,2,3};
  3. int arr3[5] = {0,1,2,3,4};

 数组的元素个数可以根据初始化的内容来确定。例如arr2在初始化时被赋予4个值,编译器会自动识别出arr2的初始化的个数。所以说数组在初始化的时候可以不指定数组的确定的大小。

  1. char arr4[3] = {'a',98, 'c'};
  2. char arr5[] = {'a','b','c'};

  char arr[]为字符类型的数组,所以在初始化时,需要给所需赋的值带上’  ’。若未带,则存的是ASCII码,例如arr4中的98,他代表的是b。我们运行看看。

  注意!重点来了! 为什么在输出完abc还又继续输出了一段乱码呢?

  这是因为在输出完abc后,编译器会继续识别数组后面的内存,直到找到’\0’才会停止。

  我们修改一下代码再看看。

  这次运行后就没有出现乱码!

  char arr6[] = "abc";

  arr6的大小是多少呢?是4!

  我们看到,用” ”初始化时系统会自动给我们在最后面添加”\0”,所以arr6的大小是4!

  1.2.1二维数组的初始化

  1. int arr[3][4] = {1,2,3,4};
  2. //arr[0][0]=1;arr[0][1]=2;arr[0][2]=3;arr[0][3]=4;arr[1][0]=···arr[2][4]=0;
  3. int arr[3][4] = {{1,2},{4,5}};
  4. //arr[0][0]=1;arr[0][1]=2;arr[0][2]=0;arr[0][3]=0;
  5. //arr[1][0]=4;arr[1][1]=5;arr[1][2]=0;arr[1][3]=0;
  6. //arr[2][0]=0;arr[2][1]=0;arr[2][2]=0;arr[2][3]=0;
  7. int arr[][4] = {{2,3},{4,5}};

  推荐初始化二位数组时带上花括号。

  例如arr[3][4],可以理解为一个三行四列的数组,也可以理解为3个一维数组(每个一维数组里面有4个值)

  在初始化时行可以省略,列不可。

2.  数组的一些使用方法

数组是使用下标来访问的,下标是从0开始。

  2.1计算数组大小

 思想:整个数组占的字节数除以数组中的任一元素所占的字节数,既为数组的大小。

sizeof()函数可实现这一操作。

例:

//一维数组

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[5] = {0};
  5. int size = sizeof(arr)/sizeof(arr[0]);//具体实现代码
  6. return 0
  7. }

//二维数组

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[5][2= {0};
  5. int size = sizeof(arr)/sizeof(arr[0][0]);//具体实现代码
  6. return 0
  7. }

  2.2输出数组的全部内容

 思想:通过循环的方法逐个输出,一维数组单循环,二维数组需要双循环。

一维数组的例子:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[10] = {1};
  5. for(i=0; i<10; ++i)
  6. {
  7. printf("%d ", arr[i]);
  8. }
  9. return 0;
  10. }

二维数组的例子:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[3][4] = {0};
  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("%d ", arr[i][j]);
  12. }
  13. }
  14. return 0;
  15. }

3. 数组在内存中的存储

我们用接下来的代码,观察一维数组在内存中的存储。

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

  仔细观察输出的结果,arr[0]到arr[1],arr[1]到arr[2],在内存中的地址依次递增了4,这是因为我们定义的arr数组是int型的,每个元素占4个字节,那么可以说arr[0]到arr[1]到arr[2]是连续递增的,所以随着数组下标的增长,元素的地址,也在有规律的递增

  由此可以得出结论:数组在内存中是连续存放的

  我们用接下来的代码,观察二维数组在内存中的存储。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[3][3];
  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. }

通过结果我们可以分析到,其实二维数组也是像一维数组一样,线性连续且递增。

4. 数组越界

  以下面的代码为例子:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[3];
  5. printf("%d", arr[100]);
  6. return 0;
  7. }

  输出arr[100],已经远远超出了我们所创建的arr[3],很明显的发生了越界,而我们的编译器并没有报错并且成功运行,这就要我们在平时的编程中要非常注意数组是否发生越界。

额外提一提数组名

  数组名代表什么?数组名代表数组首元素的地址(&arr和sizeof(arr)例外)。

我们来一段代码验证一下。

如果感觉看完这篇文章对您有一点点帮助,那就请留下您的赞

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/538761
推荐阅读
相关标签