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

 目录

1. 数组的创建和初始化

  1.1数组的创建

  1.2 数组的初始化

  1.2.1一维数组的初始化 

  1.2.1二维数组的初始化

2.  数组的一些使用方法

  2.1计算数组大小

  2.2输出数组的全部内容

3. 数组在内存中的存储

4. 数组越界

额外提一提数组名


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

1. 数组的创建和初始化

  1.1数组的创建

一维数组的创建

    方法: type name[size]

           类型 命名[大小]

    例:   int arr[10];

             char p[5];

      double a[8];

     注意: 在c语言中不可以进行下面所示的创建方法

     int count = 10;

     int arr2[count];

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

     二维数组的创建

  方法: type name[size][size]

         类型 命名[大小][大小]

  例:   int arr[10][6];

         char p[5][8];

         double a[8][3];

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

    

  1.2 数组的初始化

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

  1.2.1一维数组的初始化 

int arr1[10] = {0,1,2};

int arr2[] = {0,1,2,3};

int arr3[5] = {0,1,2,3,4};

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

char arr4[3] = {'a',98, 'c'};

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二维数组的初始化

int arr[3][4] = {1,2,3,4};

//arr[0][0]=1;arr[0][1]=2;arr[0][2]=3;arr[0][3]=4;arr[1][0]=···arr[2][4]=0;



int arr[3][4] = {{1,2},{4,5}};

//arr[0][0]=1;arr[0][1]=2;arr[0][2]=0;arr[0][3]=0;

//arr[1][0]=4;arr[1][1]=5;arr[1][2]=0;arr[1][3]=0;

//arr[2][0]=0;arr[2][1]=0;arr[2][2]=0;arr[2][3]=0;



int arr[][4] = {{2,3},{4,5}};

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

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

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

2.  数组的一些使用方法

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

  2.1计算数组大小

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

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

例:

//一维数组

#include <stdio.h>

int main()
{
  int arr[5] = {0};
  int size = sizeof(arr)/sizeof(arr[0]);//具体实现代码
  return 0;
}

//二维数组

#include <stdio.h>

int main()
{
  int arr[5][2] = {0};
  int size = sizeof(arr)/sizeof(arr[0][0]);//具体实现代码
  return 0;
}

  2.2输出数组的全部内容

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

一维数组的例子:

#include <stdio.h>

int main()
{
  int arr[10] = {1};
  for(i=0; i<10; ++i)
  {
  printf("%d ", arr[i]);
  }
  return 0;
}

二维数组的例子:

#include <stdio.h>

int main()
{
  int arr[3][4] = {0};
  int i = 0;
  for(i=0; i<3; i++)
{
    int j = 0;
    for(j=0; j<4; j++)
   {
      printf("%d ", arr[i][j]);
   }
}
return 0;
}

3. 数组在内存中的存储

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

#include <stdio.h> 

int main()

{
  int arr[3];
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    printf("arr[%d]地址--->%p\n", i, &arr[i]);
  }
  return 0;
}

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

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

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

#include <stdio.h>

int main()
{
	int arr[3][3];
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("arr[%d][%d]地址--->%p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

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

4. 数组越界

  以下面的代码为例子:

#include <stdio.h>

int main()
{
	int arr[3];
	printf("%d", arr[100]);
	return 0;
}

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

额外提一提数组名

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

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

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

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值