C语言-我想学习数组

一、内存分区

	内存分区大致分为三部分:代码区/常量区、静态存储区、动态存储区
	静态存储区用作储存:静态局部变量、全局变量
	动态存储区用来储存:局部变量、函数形参、函数返回值

二、数据类型

数据类型
1、数据类型的分类:
基本数据类型: int char float
基本数据类型的特点:
a)不可分解的数据类型
b)在固定的平台上,根据数据类型可知数据所占的空间大小
c)最基本的数据类型

如何保存9个人成绩?就需要 9个int 的变量。
如果40个人的成绩,就需要40个变量,便于处理这个情况,所以就需要引用数据。
这个是构造数据类型 在基本数据类型的基础上衍生出来
定义形式: int 集合名 大小{成绩1,成绩}

2、构造数据类型:数组、结构体
a)可分解为基本数据类型
b)未构造之前不知道其数据所占空间大小
3、指针类型

三、数组

3.1 概念

概念:一系列具有相同数据类型的数据的有序集合

3.2 数组的定义

数组的定义:

变量的定义:数据类型 变量名
数组的定义:数据类型 数组名[长度];
数据类型:基本数据类型
表示的是数组中元素的数据类型
数组名:符合标识符的命名规则
长度:数组中元素的数目/数量,长度必须是整型常量表达式

3.3 数组的初始化

变量的初始化: 在定义的同时并赋值
数组的初始化:在定义的同时并赋值
数据类型 数组名[长度]={元素1,元素2,元素…}
说明:

a)可以对数组中的元素进行部分初始化,未被初始化的元素默认为0
int score[5]={1,2,3};

b)对数组中的元素进行全部初始化
int score[5]={1,2,3,4,5};

c)当对数组中的全部元素进行初始化的时候,可以省略长度不写
int score[]={1,2,3,4,5};

d)对数组中的元素进行初始化的时候,并没有标明数组的长度,此时系统会根据初始化列表中元素的数目来分配相应的空间

e) 数组中的元素系统默认从第一个元素开始赋值,不会存在越级赋值的情况

f)数组中的元素不能超过定义的数组的长度

3.4 数组的赋值

数组的赋值:
变量的赋值:先定义,后赋值
数组的赋值:先定义,后赋值

注意:不能对数组进行整体赋值
int a; a=10;
int score[5];
score[5]={1,2,3,4,5}; //此赋值不合法
对数组中的元素,进行逐一赋值

数组的引用:采用下标法
下标法:数组中的元素在数组中按一定的顺序排列的编号
下标:从零开始的,注意防止越界,否则程序代码奔溃

补充说明:除了定义的时候,表示的数组的长度,其他的时候都代表了数组中的元素

注意:数组名代表了数组首元素的地址,则数组名是常量 score == &score[0]

数组 int score[5] 空间大小20个字节,而且 数组在内存中分配的空间是连续

1)逐一赋值
2)利用for循环 ,并采用下标法

 for(i=0;i<5;i++)
 {
   scanf("%d",&score[i]) 
 }

 for(i=0;i<5;i++)
 {
   printf("%d ",score[i])
 }

3)数组名法

for(i=0;i<5;i++)
{
   scanf("%d", score+i)  //score+i==&score[i]
}
 for(i=0;i<5;i++)
{
   printf("%d ",score[i])
} 

4)指针法:

int score[5]int *p=score;  //p=score
 for(i=0;i<5;i++)
{
  scanf("%d", p++)  
}
 for(i=0;i<5;i++)
{
   printf("%d ",score[i])
}

score+i 与 p++
分析:score 是数组首元素的地址,是一个常量
score++不合法,自增运算符操作的数据必须
是变量
p++ :p是指针,表示变量,所以可以这样用

3.5 数组的大小

数组的大小: (数组所占空间的大小)
a)数组中元素的数据类型*元素的数目 int a[5]
b) int a[]={1,2,34,44,5}
数组的长度省略,如何确定数组中元素的数目
数组所占空间大小/数组元素的数据类型

元素的数目:sizeof(数组名)/sizeof(元素数据类型)

练习:输入6个人的成绩,然后求平均值,
并找出最高成绩和最低成绩

注意: int a[6]=6;//元素数据都相同,这样赋值不合法
int a[6]={0}; //对数组进行清零
int a[6]={6};

3.6 冒泡排序

冒泡排序:
相邻的两个数据进行比较大小
1 2 3 4 5 6 7 8 9 10

int a[10]={1, 2 ,3 ,4, 5 ,6 ,7, 8, 9,  10}
for(i=0;i<10;i++)
 for(j=0;j<10-1-i;j++)
   {
      if(a[j]<a[j+1])
      {
       	temp=a[j+1];
       	a[j+1]=a[j];
       	a[j]=temp;	
      }
}

四、二维数组

4.1 二维数组的定义

二维数组的定义
数据类型 数组名[长度1] [长度2]
长度1 :表示行的数目
长度2 : 表示列的数目

4.2 二维数组的初始化

数据类型 数组名[长度1] [长度2]={}

1)以行为单位进行全部初始化
int a [3] [3]={{1,2,3},{4,5,6},{7,8,9}};

2)以行为单位进行部分初始化
int a [3] [3]={{1,2,3},{4,5},{8,9}};
在以行为单位进行初始化的时候,遵循一维数组的
特性默认从第一个元素开始赋值

3)对数组进行整体初始化
int a [3] [3]={1,2,4,5,6,8,9};
数组初始化按照先行后列的顺序进行初始化
数组没有初始化的时候,默认为0

4)数组进行初始化的时候行的长度可以省略
但是列的长度不能被省略
int a[][3]={1,2,4,5,6,8,9};

5)一维数组长度可以省略,其空间的大小按照数组中
元素的数目进行分配相应的空间大小

4.3 二维数组的赋值

二维数组的赋值
采用下标法,从0开始,防止越界

	  		 a[3] [3]
	  		 a[0] [0]  a[0] [1]
  		2)逐一赋值
  		3)利用循环赋值,采用下标法
	  for(i=0;i<3;i++)
	  		  {
	  		    for(j=0;j<3;j++)
	  		      scanf("%d ",&a[i][j])
	  		  }

4)二维数组的数组名代表数组首元素的地址

   a= &a[0] [0]

4.4 二维数组的大小

二维数组的大小:
行数列数元素的数据类型的大小

4.5 二维数组中的元素在数组中的位置

二维数组中的元素在数组中的位置:
数组 int a[m] [n]
元素 a[i] [j] 在数组中的位置:i*n+j+1

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

五、字符数组

5.1 概念

概念:用char类型定义的数组,就叫做字符数组
char a[10];

5.2 字符数组的定义

char 数组名[长度];

5.3 字符数组的初始化

char b[5]={'h','e','l','l','o'};

注意:如果对字符数组是部分初始化,未被初始化的元素是‘\0’----0

5.4 字符数组的赋值

字符数组在定义的时候没有进行初始化,以下不能对字符数组进行整体赋值。

char b[5];
b[5]={'h','e','l','l','o'};  //不合法的

1)逐一赋值

b[0]='h';
b[1]='l'

2)采用for循环进行赋值

for(i=0;i<5;i++)
scanf("%c",&b[i]);

5.5 字符串

字符数组除可以存储字符,它还可以存储字符串

'h' 'e' 'l' 'l' 'o' '\0' ="hello"

5.6 字符串的初始化

char b[6]={'h','e','l','l','o'};	 
char b[6]={"hello"};
char b[6]="hello";

说明:字符串跟字符数组的区别,就看数组里面有没有’\0’的位置存在

5.7 字符串的赋值

1)scanf("%s",b);
2)逐一赋值
b[0]=‘h’

b[5]=’\0’;

六、字符串输入输出函数

6.1 gets()函数

函数功能:字符串输入函数
函数用法:gets(数组名);
函数特点:gets函数只能输入一个字符串

gets函数可以识别空格 、tab键并将其保存在数组中
scanf("%s",数组名)也可以获取字符串,但是一旦遇到空格键,或者tab键就停止获取

6.2 puts()函数

函数功能:字符串输出函数
函数用法:puts(数组名)
函数特点:一次只能输出一个字符串

printf函数以字符串格式输出一次只能输出一个字符串
printf("%c",str[i])
puts函数可以自动换行
printf函数必须手动换行

七、字符串的相关操作函数

以下所有函数所在的头文件:#include<string.h>

7.1 strlen()函数

函数功能:输出字符串的长度
函数形式:strlen(数组名)
函数特点:输出的是字符串的个数,
但不包括字符’\0’;

sizeof():数据的空间的大小,计算包括’\0’
本质:关键字

7.2 strcpy()函数

函数功能:字符串拷贝函数
函数形式:strcpy(数组1,字符串)
函数原理:将字符串里面的内容拷贝到数组1中
执行过程:将字符串里面的内容连同它的’\0’一起复制到数组1中
注意: 字符数组1必须足够大

7.3 strcat()函数

函数功能:字符串连接函数
函数形式:strcat(数组1,数组2)
执行过程:将数组2中的内容连同’\0’一起连接到在数组1中(会从数组1的’\0’的位置开始连接,此时会覆盖掉数组1的’\0’);
注意:字符数组1必须足够大

7.4 strcmp()函数

函数功能:字符比较函数
函数形式:strcmp(数组1,数组2)
执行过程:数组1和数组2从第一个元素起开始比较;直到遇到字符’\0’,就结束比较,比较的是字符数组元素的ASCII码值。

如果数组1和数组2的ASCII码值相等,则返回0
如果数组1的ASCII码值大,则返回1
如果数组2的ASCII码值大,则返回-1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_翩翩少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值