C语言数组

数组的概念

数组是一组 相同数据类型的元素的集合,便于处理大规模的数据。
从中我们知道:
1.数组中存放至少一个元素
2.数组中存放的多个数据,类型相同。
数组分为一维数组多维数组,多维数组常见的是二维数组。
**注意:数组名只有在sizeof 和 & 地址符后才表示整个数组,其他都表示首元素的地址。
数组名既可以表示数组的地址,也可以表示数组首元素的地址,这两个在数值上是一样的,但是含义不一样。

在数组中的第一个元素为a[0],数组下标是从0开始的
例如: 求40个学生的语文成绩,40个学生语文成绩都是相同的整数int类型表示一个变量语文成绩,可以用数组一次性表示他们的成绩。老师需要他们每人的总成绩平均分(可能有小数),所以全是float类型

int Chinese[40] = { 90, 80, 70, 76…};
folat Chinese[40] = {78.6, 80.5, 78.6, 67.0, 90.8…};


一、 一维数组的创建与初始化

一维数组的定义(三要素:类型、名称、大小)

type arr_name[常量值] = { 初始值1, 初始值2,初始值3…};
数据类型 数组名[常量表达式] = {初始值1,初始值2, 初始值3… };

例如:

int a[4] = { 1, 2, 3, 4 };
//数据声明中使用的 数组 a[4]中的 “[ ]” ,只是一个分隔符
//访问每个元素用的如 元素 2为a[1]的 “[ ]” , 是运算符

一维数组的引用

数组名[下标]

数组的初始化:

1)初始化个数小于数组常量表达式数(数组名[常量表达式]),若大于常量表达式数则会报错。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a[4] = { 1,2,3,4,5 };//错误,初始值大于数组大小
	return 0;
}

2)数组名表示用来说明数组元素的数据类型,可以是基本类型、构造类型、或指针类型。对于同一个数组,其所有元素数据类型都是相同的。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a[4] = { 1,2.145,3.14159,4,5 };//错误,数组内元素内型不相同
	return 0;
}

3)数组名表示这个数组类型变量的名称,有时也称为数组标识符,其命名规则和变量名相同,遵循标识符的命名规则

标识符命名规则:1.只能由字母、数字、下划线组成
2.由非数字开头
3.字母区分大小写
4.不能用系统的关键字(保留字作变量名)
5.普通变量一般采用小驼峰命名方法
(第一个单词首字母小写,后面每个单词首字母大写)
6.类等变量一般采用大驼峰命名方法
(每个单词第一个字母大写其他小写)
7.标识符名最好做到见名知意
8. 先定义变量后使用

4)方括号中“[ ]”为数组标志,是数组重要组成部分不可省略
5)方括号中的常量表达式(下标),可以是整型常量、整型常量表达式、或符号常量,用来表示数组中元素的个数,即数组长度。(不能用const常变量带入数组常量表达式,虽然const在值初始化后面无法更改,但除非同时也是一个编译时常量。例如:(C++)使用constexpr修饰或在类定义外部的静态const整型变量)

#define  _CRT_SECURE_NO_WARNINGS 1//字符常量来表示常量表达式
#define n 21 //用宏定义
#include<stdio.h>
int main()
{
	int arr[n] = { 1,2,3,4,5,6 };
	printf("%d", arr[n]);
	return 0;
}

6)数组在内存中是连续存放的,数组为什么类型,每个相邻元素之间就相差其数据类型长度

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>//一维数组在内存中是连续的,为int型,因而相邻元素地址都相差4个字节
//X86表示32位环境在86位环境中地址是32bit位
//X64表示64位环境在64位环境中地址是64bit位
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++)
	{
		printf("&arr[%d]=%p\n", i, &arr[i]);
		//%p地址打印,&——表示取地址操作符取出变量在内存中的地址
	}

在这里插入图片描述

7)C语言中,不允许对数组的大小进行动态定义,即不能在方括号“[ ]”中用变量或含变量的表达式来表示数组的长度。

#define  _CRT_SECURE_NO_WARNINGS 1//字符常量来表示常量表达式
#include<stdio.h>
int main()
{
	int n;
	int arr[n];//错误,因为n为变量
	int arr[n + 1];//错误,因为n+3是含有变量的表达式 
	return 0;

8)下标从0开始到n-1结束

a[4] = { a[0], a[1], a[2], a[3] };

9)下标越界可能不会提示错误
10)数组不指定大小,默认为1个,可以不输入常量表达式,但一定要初始值,对于不确定数组大小,数组会自动根据初始值设定

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int s[] = { 0};//错误,未指定大小
	scanf("%d", s);
	return 0;
}

在这里插入图片描述

二、二维数组

二维数组的定义

数据类型 数组名[常量表达式1][常量表达式2];
int a [3][4];

二维数组又可以看做一种特殊的数组,二维数组也称为数组的数组。
如 a[4][3] ,可以看做一个一维数组,四个元素:a[0],a[1],a[2],a[3],每个元素包含三个元素的一维数组
在这里插入图片描述

二维数组引用

数组名[下标][下标]

二维数组的初始化

1)分行给二维数组赋值

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

以数组的行形成另一个数组给其赋值,即数组的数组。
其方法直观,把第1个{花括号}内数据给第一行元素,第2个{花括号}内数据给第二个元素…即按行赋初值。
2)可以将所有数据写在一个花括号中,按数组元素在内存中的排列顺序对各元素赋初值。

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

3)可以对部分元素进行赋值其余值默认为0

int a[3][4] = { 1,2,3,4,5 };//自动把第1行排满再排第二行未赋值数默认为0
int b[2][3] = { {1}, {2} };
int c[3][4] = { {1},{2,3,4,5}, {2,3} };//可以每行赋值部分
int d[3][4] = { {1},{ },{2,3,4} };//可直接对某一行不赋值用这个{ }
int e[3][4] = { {1}, {2} };//少赋值1行直接默认第3行全为0

int b[2][3]这样赋值的作用只对各行的第一列(即序号为0的列数为第1列)赋了初值,其余元素自动为0
4)如果对全部元素都赋初值(即提供全部初始数据), 则定义数组对行(第1维长度)可以不指定,但列(第2维长度)不可省略

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

与这个等价:

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

系统根据总个数和第2维长度算出第1维长度,数组一共12个元素,每行4列
显然可以确定行数。
在定义时也可以只对部分元素赋值而省略行(第1维的长度),但应分行赋值

int a[ ][4] = { {0,0,4},{ },{9} };

三、字符数组与字符串变量

字符数组

字符数组的定义

char 数组名[变量表达式] = { ‘字符1’, ‘字符2’, ‘字符3’, ‘字符4’…};

1)字符数组中也有一维数组和多维数组
2)字符数组可以用字符常量或字符串进行初始化
3)字符数组未赋值的地方系统自动设置为空 ,\0和其他的数值数组不同(\0表示字符串结束的标志遇到\0则字符停止)
4)空字符数组用 ‘\0’ 表示

char a[12] = { ‘\0’ };//和数组一样既然未初始化变量就一定要有下标
//下面错误表达实例
char a[ ] = {‘\0’ } ;
char a[20] ={ ‘\0’ };//空数组

字符数组引用

数组名[常量表达式]

字符串与字符串结束的标志\0

"双引号"为字符串表达,例如输入scanf输出printf函数为字符串函数【printf(" a");】
(“我是猪”、“12345”、"ABC、、1||!“都是字符串表达,只要是” ",则是字符串)
'单引号’为字符表达(只能有一个常量),如putchar函数为字符函数【putchar(‘a’);】
('\a’这中转义字符是一个字符、'我’是一个字符、'q’同样、'0’也是一个字符)

字符串与字符的区别:

字符串

char c[ ] = { “hello world” };
char c[ ] = “hello world!”;//可省略花括号

字符

char c[ ] = { ‘h’, ‘e’, ‘l’, ‘l’,‘o’,’ ‘,‘w’,‘r’,‘o’,‘l’,‘d’,’!‘,’\0’};//\0表示字符串结束若没有,则会一直到找到\0为止

//与char c[ ] = { ‘h’, ‘e’, ‘l’, ‘l’,‘o’,’ ‘,‘w’,‘r’,‘o’,‘l’,‘d’,’!'};不等价

没有\0则会出现一点问题如以下
在这里插入图片描述
对比字符与字符串
在这里插入图片描述

求字符串长度和字符数组长度用strlen

计算字符串和数组长度用 strlen函数(STPing LENgth字符串长度),其用来专门计算字符串长度的函数。函数值为字符串中的实际长度(不包括’\0’在内)

对比sizeof

sizeof 计算数组字节大小,其计算时会加上’\0’
strlen 计算字符数组中的字符的个数,字符数组中的最后一个元素’\0’标志计算字符结束未算入’\0’
strlen只能用于字符

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char arr1[] = "hello world";//以一维数组定义
	int qz = sizeof(arr1) - 1;//sizeof计算数组字节大小sizeof计算会加上\0因而11
	int sz = strlen(arr1) - 1;
	//strlen计算字符数组中字符元素的个数,字符数组中的最后一个元素是\0,标志字符结束
	printf("%zd %d", qz, sz);
	return 0;
}

在这里插入图片描述

字符数组的输入输出

1)逐个字符输入输出。用格式符"%c"输入或输出一个字符。
输出:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char a[25] = "I like free";//字符串
	for (int i = 0; i < 25; i++)
	{
		printf("%c", a[i]);一个一个输出
		putchar('\n');
	}
	return 0;
}

在这里插入图片描述
输入:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char a[9] = { '\0'};
	for (int i = 0; i < 9; i++)
	scanf("%c", &a[i]);
	for (int i = 0; i < 9; i++)
	{
		printf("%c", a[i]);
	}
	return 0;
}

2)将整个字符串一次性输入或输出,用%s格式符,意思是对字符串(string)的输入。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char a[] = "I love China.";
	printf("%s", a);
	return 0;
}

3)若字符数组长度大于实际的字符串长度,或字符数组中由字符 ‘\0’ ,也只能输出到遇到’\0’时结束

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char a[30] = "I love China.";
	printf("%s", a);
	return 0;

4)数组下标值不能小于实际长度会报错
5)若一个数组中含有多个’\0’,数组在遇到第一个’\0’就输出结束了
6)可以用scanf函数输入字符串,scanf函数输入项是已经定义定义的字符数组名,输入的字符串需短于已定义的字符数组的长度(数组下标),否则会出现Bug

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a[9] = { '\0'};
	scanf("%s",&a);
	//只能输入8个数字(9-1)
	for (int i = 0; i < 9; i++)
	{
		printf("%c", a[i]);
	}
	return 0;
}

使用字符串处理函数

1)puts函数——输出字符串的函数

其形式为

puts(字符数组)

其作用是将一个字符串(以\0结束的字符序列)输出到终端只能输入\输出一个字符串

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a[] = "I love China.";
	puts(a);
	return 0;
}

在这里插入图片描述
puts和putchar函数十分相似

puts(“I love China”);
putchar(‘a’);

在这里插入图片描述

2)gets函数——输入字符串函数

其形式为

gets(字符数组)

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

只能输入\输出一个字符串
不可写成puts(a,b)和gets(a,b)

将输入的字符串放"XXXX”送给字符数组a,(请注意,送给数组的共有5个字符,而不是4个字符),返回的函数值是字符数组a的第一个元素地址。一般利用gets函数的目的是向字符数输入一个字符串,而不大关心其函数值

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a[5] = { '\0' };//空字符数组
	gets(a);
	puts(a);
	return 0;
}

在这里插入图片描述

与getchar( )函数对比

getchar()是C语言中的一个标准库函数,用于从标准输入(通常是键盘)读取一个字符(包括空格、制表符、换行符)。该函数在<stdio.h>头文件声明。
当你调用getchar时,它会等待用户输入一个字符如何按下回车键输入。该函数会返回读取到的字符ASCII值(作为int类型返回,尽管它通常被赋值给char类型变量)
注意:

  1. getchar()返回一个int类型的值,这样它可以返回所有可能的字符值。包括EOF(end of file通常在文件操作中表示文件结束)尽管我们经常给getchar()返回一个值赋给一个char类型变量,但最佳实践应该赋给一个int类型变量,并在必要时检查
  2. 如果调用getchar( )后直接按下回车键(没有输入如何字符)它返回一个换行符(‘\n’)的ASCII值
  3. 如果想连续读取多个字符,可在循环中使用getchar().
3)strcat函数——字符串连接函数

其形式为

strcat(字符数组1,字符数组2)

strcat 是STRing CATenate(字符串连接)的缩写。其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个数值——字符数组1的地址。1.字符数组1必须足够大,以便于容纳字符数组2的字符串
若字符数组1在定义时为char str1[] = "hope ";则会出问题因长度不够
2.连接前两个字符串后面都有 ‘\0’ ,连接时将字符串1后面的 '\0’取消,只在新串最后保留 ‘\0’

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[30] = "hope ";//字符数组1必须足够大,以便于容纳字符数组2的字符串
	//若字符数组1在定义时为char str1[] = "hope ";则会出问题因长度不够
	char str2[20] = "world pace";
	printf("%s",strcat(str1, str2));
	return 0;
}

在这里插入图片描述

4)strcpy和strncpy函数——字符串复制函数

其形式为

strcpy(字符数组1,字符串)

strcpy 函数是STRingCoPY字符串的缩写,它表示“字符串复制函数”,作用是将字符串2复制到字符串1中

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a[20], b[] = "China";
	int c = strcpy(a, b);
	printf("a[20]=%s\nb[]=%s", a,b);
	return 0;
}

在这里插入图片描述
1.字符数组1必须足够大,以便容纳被复制的字符串2,字符串1>=字符串2
2.“字符数组1”必须是数组名形式,“字符串2”可以是字符数组名\字符串常量

strcpy(str,“China”)

**3.不能用赋值语句将字符串常量或字符数组字节给一个字符数组。**字符数组名是一个地址常量,它不能改变值,正如数值型数组名不不能被赋值一样。

str = “China”;//错用赋值语句将常量赋值给数组
str = str2;//错用赋值语句将字符数组赋值给另一个字符数组

4.可用strncpy函数字符串2中前面n个字符复制到字符数组1中,

strncpy(str1,str2,2);

5)strcmp函数——字符串比较函数

其形式为

strcmp(字符串1,字符串2)

strcmp是STRing CoMPare(字符串比较),它的作用是比较字符串1和字符串2。
(1)如果字符全部相等,则俩个字符相等。
(2)若出现不相等的字符,则以第一对不等的字符比较结果为准。
(字符串英文字典位置在后面越大)

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20] = "China";
	char str2[20] = "CHina";
	char str3[20] = "Chinese";
	printf("%d\n", strcmp(str1, str2));
	printf("%d\n", strcmp("A", "b"));
	if (strcmp(str1, str3) > 0)
		printf("yes");
	return 0;
}

在这里插入图片描述

6)strlwr函数——转换为小写的函数

其形式为

strlwr(字符串)

strlwr函数是STRing LoWeRcase(字符串小写),函数的作用是将字符串中的大写字母换成小写字母。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char a[30] = "ABCDEF IHHE";

	printf("%s", strlwr(a));
	return 0;
}

在这里插入图片描述
在这里插入图片描述

7)strupr函数——转换为大写的函数

其形式为

strupr(字符串)

strupr函数是STRing UPpeRcase(字符串大写)。函数的作用是将字符串中的小写字母转换为大写字母。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char a[40] = "hhhhhhhh hhhhehhe";
	printf("%s", _strupr(a));
	return 0;
}

在这里插入图片描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值