数组类型和字符数组

一维数组

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

定义

一般形式:
类型说明符 数组名[常量表达式];

  • 数组名与变量名规则相同
  • 常量表达式用来表示元素的个数,即数组长度(下标从0开始)
  • 常量表达式中要给一个常量或符号常量,不能使用变量

例如:char arr3[10]; float arr4[1]; double arr5[20];

初始化

数组的初始化:在创建数组的同时给数组的内容一些合理初始值(初始化)

  1. 在定义数组时对全部数组元素赋予初始值

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

  1. 可以只给数组中的一部分赋值

例如:int arr[10] = {1,2,3};

  1. 可以使一个数组中全部元素值为0

例如:int arr[10] = {0};

  1. 赋予初值时可以不指定数组长度,系统会自动根据{ }中的数据个数来确定数组的元素个数

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

引用

数组的引用操作符: [ ] ,下标引用操作符。就是数组访问的操作符

只能引用数组元素而不能一次整体调用整个数组全部元素的值

表示形式:
数组名[下标]

例如:

#include <stdio.h>
int main()
{
 int arr[10] = {0};//数组的不完全初始化
    //计算数组的元素个数
    int sz = sizeof(arr)/sizeof(arr[0]);
 //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
 int i = 0;//做下标
 for(i=0; i<10; i++)//这里写10,好不好?
 {
 arr[i] = i;
 } 
 //输出数组的内容
 for(i=0; i<10; ++i)
 {
 printf("%d ", arr[i]);
 }
 return 0;
}

结果:
0 1 2 3 4 5 6 7 8 9

  1. 数组是使用下标来访问,下标从0开始
  2. 数组的大小可以通过计算得到

计算数组的大小:
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);

在内存中的存储

数组在内存中是连续存放的
随着数组下标的增长,元素的地址,也在有规律的递增

最低的地址对应第一个元素,最高的地址对应最后一个元素

在这里插入图片描述

二维数组

二维数组常称为矩阵

定义

一般形式:
类型 数组名[常量表达式1][常量表达式2];
常量表达式1:行
常量表达式2:列

例如:
int x[3][4];
在这里插入图片描述

初始化

通过在括号内为每行指定值来进行初始化

  1. 分行给二维数组赋初值

int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
在这里插入图片描述

  1. 所有数据都写在一个花括号

int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
与第一种相同

  1. 对部分元素赋值

int arr[3][4] = {{1},{5},{9}};
在这里插入图片描述

  1. 对全部元素都赋初值,则定义数组时对行可以省略,但列不可以

int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
等价于
int arr[ ][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr[ ][4] = {{2,3},{4,5}};

引用

一般形式:
数组名[下标][下标]
例如:

#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++)
		{
			arr[i][j] = i * 4 + j;
		}
	}
	for (i = 0; i<3; i++)
	{
		int j = 0;
		for (j = 0; j<4; j++)
		{
			printf("%d ", arr[i][j]);
		}
	}
	return 0;
}

结果:
0 1 2 3 4 5 6 7 8 9 10 11

在内存中的存储

二维数组在内存中也是连续存储的
在这里插入图片描述

数组越界

数组的下标是有范围限制的。

  • 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1
  • 数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问

字符数组

定义

用来存放字符数据的数组。在字符数组中的一个元素内存放一个字符

字符型数据是以整数形式(ASCII代码)存放的,所以也可以用整型数组来存放字符数据

初始化

把各个字符一次赋给数组的各个元素

例如:char c[10] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’};
在这里插入图片描述

  1. 不进行初始化,则数组中各元素的值是不可预料的
  2. 若初值个数(字符个数)大于数组长度,则出现语法错误
  3. 初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符
  4. 若初值个数与预定的数组长度相同,在定义时可以省略数组长度,由初值个数确定数组长度
  5. 也可以定义和初始化一个二维字符数组

例如:

#include<stdio.h>//头文件

int main()
{
	char c[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
	int i;
	for (i = 0; i < 10; i++)
		printf("%c", c[i]);
	printf("\n");
	return 0;
}

结果:
abcdefghij

字符串

将字符串作为字符数组来处理
字符串中的字符是逐个存放到数组元素中的

字符串的实际长度与数组长度相等

字符串结束标志:以‘\0’作为结束标志,在遇见字符‘\0’时,表示字符串结束,在他前面的字符组成一个字符串

在用字符数组存储字符串常量时会自动加一个‘\0’作为结束符。
例如:
“i am a student”共有14个字符。字符串是存放在一维数组中的,在数组中它占15个字节,最后一个字节‘\0’是由系统自动加上的。

‘\0’代表ASCII码为0的字符

对字符数组初始化的方法有两种:
c的长度为15

  1. char c[ ] = { “i am a student”};
  2. char c[ ] = “i am a student” ;

等价于
char c[ ] = { ‘i’, ’ ', ‘a’, ‘m’, ’ ‘, a’, ’ ', ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’ };长度为15
不同于
char c[ ] = { ‘i’, ’ ', ‘a’, ‘m’, ’ ‘, a’, ’ ', ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’ };长度为14

遇见‘\0’就停止输出

字符数组的输入输出

  1. 逐个字符输入输出:%c输入或输出一个字符
  2. 整个字符串一次输入输出:%s输入或输出一个字符串
  • 输出的字符中不包括’\0’
  • %s输出字符串时,printf函数中的输出项是字符数组名(c),而不是数组元素名(c[0])
  • 若数组长度大于字符串的实际长度,也只输出到遇’\0’结束
  • 若一个字符数组中包括一个以上’\0’,则遇的第一个’\0’时输出就结束
  • 可以用scanf函数输入一个字符串:scanf(“%s”, c);
  • 利用scanf函数输入多个字符串:scanf(“%s%s%s”, a, b, c );
  • scanf函数中的输入项如果是字符数组名,不要再加&
  • 数组名代表数组第一个元素的地址

puts函数

输出字符串的函数

一般形式:
puts(字符数组)

作用:将一个字符串(以’\0’结束的字符序列)输出到终端

在用puts输出时将字符串结束标志’\0’转换成’\n’,即完成字符串后换行

gets函数

输入字符串的函数

一般形式:
gets(字符数组)

作用:从终端输入一个字符串到字符数组,并得到一个函数值。该函数值是字符数组的起始地址。

一般利用gets函数的目的是向字符数组输入一个字符串

用puts和gets函数只能输出或输入一个字符串

strcat函数

字符串连接函数

一般形式:
strcat(字符数组1,字符数组2)

作用:把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址

  • 字符数组1必须足够大,以便容纳连接后的新字符串。
  • 连接前两个字符串的后面都有‘\0’,连接时将字符串1后面的‘\0’取消,只在新串最后保留‘\0’

例如:

#include<stdio.h>
int main()
{
	char str1[30] = { "People's Republic of " };
	char str2[] = { "China" };
	printf("%s", strcat(str1, str2));
	return 0;
}

结果:
People’s Republic of China
在这里插入图片描述
str3为两个合成后的最终值

strcpy和strncpy

字符串复制函数

一般形式:
strcpy(字符数组1,字符串2)

作用:将字符串2复制到字符数组1中去

  • 例如:
    char str1[10],str2[ ] = “China”;
    strcpy(str1,str2);
    在这里插入图片描述
  1. 字符数组1的长度大于等于字符串2的长度
  2. “字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名也可以是一个字符串常量
  3. 复制前要先对字符数组1进行初始化或赋值
  4. 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。
  5. 字符数组名是一个地址常量,不能改变值,正如数值型数组名不能被赋值。
  6. strcpy函数只能将一个字符赋给一个字符型变量或字符数组元素

strncpy函数一般式:
strncpy(str1,str2,2)

作用:将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符

但复制的字符个数n不应多于str1中原有的字符(不包括‘\0’)

strcmp函数

字符串比较函数
一般形式:
strcmp(字符串1,字符串2)

作用:比较字符串1和字符串2

字符串比较规则:
将两个字符串从左向右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇见‘\0’为止

  1. 若全部字符相同,则认为两个字符串相等
  2. 若出现不相同的字符,则以第一对不相同的字符的比较结果为准

例如:“A”<“B”,“a”>“A”,“computer”>“compare”

  1. 比较两个字符串都由英文字母组成:在英文字典中位置在后面的为“大”

例如:“computer”>“compare”

比较的结果由函数值带回

  • 如果字符串1与字符串2相同,则函数值为0
  • 如果字符串1>字符串2,则函数值为一个正整数
  • 如果字符串1<字符串2,则函数值为一个负整数

对两个字符串比较,不能用 if(str1>str2),只能 if(strcmp(str1>str2)>0)

strlen函数

测字符串长度的函数

一般形式:
strlen(字符数组)

作用:测试字符串长度的函数。函数的值为字符串中的实际长度(不包括‘\0’在内)

strlwr函数

转换为小写的函数

一般形式:
strlwr(字符串)

作用:将字符串中大写字母换成小写字母

strupr函数

转换为大写的函数

一般形式:
strupr(字符串)

作用:将字符串中小写字母换成大写字母

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值