初识C语言----数组

 

1. 数组的概念

数组是 ⼀组相同类型元素的集合 ;核心内容主要为以下两点:
数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
数组中存放的多个数据, 类型是相同的
数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。

 

简而言之,数组就是存放一组数据(相同类型的数据),可以是整型、字符型、浮点型等

//存放的都是整型的元素
int arr1[10];
//存放的都是字符型元素
char arr2[10];
//存放的都是浮点型元素
int float[10];

2. ⼀维数组的创建和初始化

 2.1一维数组的创建

基本语法如下:

type arr_name[常量值];
type 指定的是数组中存放数据的类型,可以是: char short int float 等,也可以自定义的类型
arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义就行。
[] 中的常量值是⽤来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。
存放在数组的值被称为 数组的元素 ,数组在创建的时候可以指定数组的 ⼤⼩ 和数组的 元素类型

 

 2.2 一维数组的初始化

数组在创建的时候,我们需要给定⼀些初始值值,这种就称为初始化。

数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中。

2.2.1 完全初始化
//完全初始化
//10个元素都被赋予了初值
int aar[10]={1,2,3,4,5,6,7,8,9,10};
2.2.2不完全初始化
//不完全初始化
//前三个元素被初始化,其余初始化为0
int arr[10]={1,2,3};

 此外,我们不能将数组初始化的个数大于所设定的数组个数,这是错误的,编译器语法会报错

//错误的初始化--初始化太多项
int arr[3]={1,2,3,4};

 

3. ⼀维数组的使用

每个数组元素都有对应的下标,与常识有点差别,数组的下标是从0开始

假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号

如果我们定义了一个数组,如下,10个元素,那么它的下标就是0~~9

int arr[10]={1,2,3,4,5,6,7,8,9,10};

举个栗子:

#include<stdio.h>
int main()
{
   int arr[10] = {1,2,3,4,5,6,7,8,9,10};
   int i = 0;
   //一维数组的输入
    for(i=0;i<10;i++)
   {
      //循环打印数组每个元素
      scanf("%d",&arr[i]);//注意%d之后不要有空格
   }

   //一维数组的打印
   for(i=0;i<10;i++)
   {
      //循环打印数组每个元素
      printf("%d ",arr[i]);
   }
   return 0;
}
//结果为1 2 3 4 5 6 7 8 9 

4. ⼀维数组在内存中的存储

当我们运行以下代码时,能够得到各数组元素的地址

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

 运行结果如下:

做个补充,

(1)这里显示的地址是十六进制的数,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(逢十六进一);

(2)计算机在处理数据时,都要将数据加载到内存中处理,所以我们买电脑时内存是一个重要指标,而在内存中,会被划分为一小块一小块的内存单元,然后给每个内存单元编上号,这就是所谓的地址,在C语言中也叫指针。

(3)这里的地址在C语言中又称为指针,它就像房间的门牌号,找到门牌号就找到了房间,找到了指针(地址)就找到了在这个内存中存储的内容,在这了我们不细讲,指针会在之后会着重讲解。

可以看出,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的 元素之间相差4(因为⼀个整型是4个字节),因此数组的存储是连续

5. sizeof计算数组元素个数

 5.1 sizeof的介绍

sizeof是C语言的一种单目操作符,如C语言的其他操作符++,--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。

注意注意,单位是字节!!!!

int a;
sizeof(int);//4
sizeof(a);//4

int arr[10];
sizeof(arr)//40(4*10)
sizeof(arr[0])//10(数组中的一个整型元素)

5.2 sizeof计算数组元素个数

在遍历数组的时候,我们经常想知道数组的元素个数,那C语⾔中有办法使⽤程序计算数组元素个数吗?答案是有的,可以使用sizeof。
从上面可知,数组中所有元素的类型都是相同的,那只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来。我们选择第⼀个元素算大小就可以计算。
#include <stido.h>
int main()
{
 int arr[10] = {0};
 //整个数组的长度(字节数)除以一个元素的长度(字节数)
 //就打印数组元素个数
 int sz = sizeof(arr)/sizeof(arr[0]);
 printf("%d\n", sz);
 return 0;
}

eg.如果是字符串数组,也可以用strlen计算(这里的strlen是一个库函数,而sizeof是一个操作符,需要大家了解一下)

#include<stdio.h>
#include<string.h>//用strlen需要引用这个头文件
int main()
{
  char arr = "hello world";//字符串数组要用双引号
  int sz = strlen(arr);//结果为11
  return 0;
}

6. ⼆维数组的创建

6.1 二维数组的概念

前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元
素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。

6.2 ⼆维数组的创建

二维数组的定义如下:

type arr_name[常量值1][常量值2];

//例如:
int arr[3][5];
double data[2][8];
解释上述代码中出现的信息:
3表⽰数组有3⾏
5表⽰每⼀⾏有5个元素
int 表⽰数组的每个元素是整型类型
arr 是数组名,可以根据自己的需要指定名字
data数组意思基本⼀致。

7. ⼆维数组的初始化

 7.1 完全初始化

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

 

7.2 不完全初始化

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

 未初始化的默认初始化为0

7.3 按照行初始化

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

未初始化的默认初始化为0 

 

7.4 初始化时省略行,但是不能省略列

int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};

 

8. ⼆维数组的使用

8.1 ⼆维数组的下标

⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定
数组中的⼀个元素。
C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的,如下所⽰:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

图中最右侧绿⾊的数字表⽰⾏号,第⼀⾏蓝⾊的数字表⽰列号,都是从0开始的,⽐如,我们说:第2 行,第4列,快速就能定位出7。
示例如下:
#include <stdio.h>
int main()
{
 int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
 printf("%d\n", arr[2][4]);
 return 0;
}

结果为7.

8.2 二维数组的输入与打印

只要能够按照⼀定的规律产⽣所有的⾏和列的数字就⾏;以上⼀段代码中的arr数组为例,⾏
的选择范围是0~2,列的取值范围是0~4,所以我们可以借助循环实现⽣成所有的下标。
#include <stdio.h>
int main()
{
 int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
 int i = 0;//遍历⾏
 //输⼊
 for(i=0; i<3; i++) //产⽣⾏号
 {
 int j = 0;
 for(j=0; j<5; j++) //产⽣列号
 {
 scanf("%d", &arr[i][j]); //输⼊数据
 }
 }
 //输出
 for(i=0; i<3; i++) //产⽣⾏号
 {
 int j = 0;
 for(j=0; j<5; j++) //产⽣列号
 {
 printf("%d ", arr[i][j]); //输出数据
 }
 printf("\n");
 }
 return 0;
}

9. ⼆维数组在内存中的存储

像⼀维数组⼀样,我们如果想研究⼆维数组在内存中的存储⽅式,我们也是可以打印出数组所有元素的地址的。代码如下:
#include <stdio.h>
int main()
{
 int arr[3][5] = { 0 };
 int i = 0;
 int j = 0;
 for (i = 0; i < 3; i++)
 {
 for (j = 0; j < 5; j++)
 {
 printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
 }
 }
 return 0;
}

结果如下:

从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。并不和我们想象的一样是按坐标轴的形式存放的。
如图所示:

10. C99中的变长数组

 

如有错误,请各位彦祖亦菲们批评指正(评论或私信都可以)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值