C语言学习笔记(五):数组的使用

news2024/9/24 21:22:55

数组的定义

数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。

用数组名和下标即可唯一地确定数组中的元素。

数组中的每一个元素都属于同一个数据类型。


一维数组

定义与引用

int a[10] = {0,1,2,3,4,5,6,7,89}; //定义数组长度为10,数组类型为整型,数组名字为a
printf("%d", a[9]);   //输出数组下标为9的元素, 即输出8

初始化

int a[10]={0,1,2,3,4,5,6,7,8,9}; //在定义数组时对全部数组元素赋予初值

int a[10]={0,1,2,3,4};  //定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0。

int a[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 给数组中全部元素赋初值为0

int a[] = { 0,1,2,3,4,5,6,7,8,9};  //自动设置数组长度为10,

二维数组

定义与引用

float a[3][4], b[5][10]; //定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组
a[3][4] = 8; //不存在a[3][4]元素,数组a可用的“行下标”的范围为0~2,“列下标”的范围为0~3

/*在引用数组元素时,下标值应在已定义的数组大小的范围内。*/
include <stdio.h>
int main()
{
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int(*p)[3];  //
	printf("%d\n", (a[0])); //a[0]表示行指针,输出第一行的地址,即第一行首元素的地址
	printf("%d\n", a[1][0]);  //输出4 
	printf("%d\n", a[0]+1); //a[0] + 1表示列指针,输出第一行第二列的地址,即2的地址
	printf("%d\n", *(a[0] + 1)); // 输出2
	printf("%d\n", *(a[0])); //输出第一行第一个元素,即1
	printf("%d\n",*(a+1)); //输出第二行的首地址
	printf("%d\n", a+1);  //输出第二行的首地址
	printf("%d\n", *(*(a + 1))); //输出第二行的首个元素4
	printf("%d\n", *a); //输出第一行的首地址
    printf("%d\n", *(*a+1)); //输出第一行第二列元素,即2
}

初始化

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //二维数组赋予初值

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};  //按排列顺序对各元素赋初值

int a[3][4]={{1},{5},{9}}; //給每行第一列元素赋值,其他元素值为0
int a[3][4]={{1},{0,6},{0,0,11}};
int a[3][4]={{1},{5,6}};  //给第1,2行部分元素赋值,其余元素值为0
int a[3][4]={{1},{},{9}}; //给第1,3行部分元素赋值,其余元素值为0	
/*如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省*/
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int a[][4]={{0,0,3},{},{0,10}}; //在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值

存储方式

C语言中,二维数组中元素排列的顺序是按行存放的。

image-20211212204447800


多维数组

定义与引用

float a[2, 3, 4];	//定义三维数组a,此处表示2页,3行,4列
a[0,0,1] = 8;  //给第0页,第0行,第一列赋值8

存储方式

多维数组元素在内存中的排列顺序为: 第1维的下标变化最慢,最右边的下标变化最快。

image-20211212205949592

字符数组

定义和引用

char c[4];
c[0]='I'; c[1]=' ';c[2]='a';c[3]='m';  //用来存放字符数据的数组是字符数组,在字符数组中的一个元素内存放一个字符。

int c[10];  //由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据
c[0]='a'; 	//合法,但浪费存储空间
printf(%c,c[0])  //引用字符数组元素

初始化

char c[10]={′I′,′ ′ ,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′} //把10个字符依次赋给c[0]~c[9]这10个元素

char c[10]={′c′,′ ′,′p′,′r′,′o′,′g′,′r′,′a′,′m′} //初值个数若大于数组长度则报错,否则只赋予给前面的元素,后面的元素值为'\0'

char c[]={′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′}; //数组长度自动设为10

char diamond[2][5]={{′ ′,′ ′,*},{′ ′,*,′ ′,*}};  //字符型二维数组

字符串结束标志

″C program″ 字符串是存放在一维数组中的,占10个字节,字符占9个字节,最后一个字节′\0′是由系统自动加上的。

char c[10]={"China"};  //数组c的前5个元素为: ′C′,′h′,′i′,′n′,′a′,第6个元素为′\0′,后4个元素也自动设定为空字符
char c[5]= "China";  //错误,数组长度应该改为6,要多存放一个'\0',但是字符串长度不包括'\0'
char c[6] = "China"; //正确
	printf("%s", c); 

可以使用二维字符数组来存储多个字符串

include <stdio.h>
int main()
{
	char i[3][10] = { "haha","hello" };
	printf("%s\n", i[1]); //输出hello
	printf("%c\n", i[0][0]); //输出h
}

输入和输出

include <stdio.h>
int main()
{
	char c[]="China";
	printf("%s\n",c);  //输出China,%s表示对字符串的输出,对应的输出项应是数组名
	return 0;
}
char c[6];
scanf("%s",c);   //从键盘输入China,系统会自动在China后面加一个′\0′结束符
/*在C语言中数组名代表该数组第一个元素的地址*/

char str1[5],str2[5],str3[5];
scanf("%s%s%s",str1,str2,str3);  //键盘输入how are you,空格作为间隔符,分别将'how','are','you'赋予给以上三个数组

char str[13];
scanf("%s",str);  //键盘输入how are you,由于空格是字符串间隔符,所以只赋值了'how'
printf("%o",str);	//用八进制形式输出数组str的起始地址

字符串处理函数

puts

puts 函数是 C 语言中的一个标准库函数,它用于将一个字符串写入到标准输出(通常是屏幕

include <stdio.h>
int main()
{
	char str[]={"China\nBeijing"};  //puts函数可以输出转义字符
	puts(str);  //在用puts输出时将字符串结束标志′\0′转换成′\n′,即输出完字符串后换行
	return 0;
}

image-20211213211958624


gets

gets函数是一种读取字符串的C语言函数。它从标准输入(通常是键盘)读取一行字符串,并将其存储到字符数组中

它以字符串作为参数,并将读取的字符串复制到这个字符数组

int main() {            
	char c[10];
	gets(c);   //若键盘输入hello,则将此字符串送给数组c,共有6个字符,而不是5个
}                //执行后会返回字符数组的起始地址  

strcat

strcat函数是字符串函数,它是用于将源字符串追加到目标字符串的尾部

include <stdio.h>
include <string.h>  //导入stract函数
int main() {
	char str1[30] = { "People′s Republic of " };   //str1数组长度要足够大
	char str2[] = { "China" };
	strcat(str1, str2); //将str2的字符串接到str1的字符串后面,再赋值给str1数组
	printf("%s", str1);	 //输出:People′s Republic of China 			
}

strcpy

strcpy函数是 C 语言中的一个字符串函数,是用来把一个字符串复制到另一个字符串的, 它的语法格式如下

strcpy(char *dest, const char *src);

其中,参数 dest 是目标字符串,参数 src 是源字符串。strcpy 函数会将 src 字符串的内容复制到 dest 字符串的内存中,并在复制完成后,返回 dest


使用实例如下:

include <stdio.h>
include <string.h>
int main() {
	char str1[15]="1234567", str2[] = "China";
	strcpy(str1, str2);  //将str2的字符串复制到str1里去
	printf("%s", str1);    //输出China,完全覆盖掉原先str1里的字符串
	
}

strncpy

strncpy函数与strcpy函数不同的是, 它可以将源字符串的前n个字符复制到目标字符串中

include <stdio.h>
include <string.h>
int main() {
	char str1[15]="1234567", str2[] = "China";
	strncpy(str1, str2, 2);   //将str2字符串的前两个复制到str1里
	printf("%s", str1);    //输出Ch,完全覆盖
	
}	

strcmp

strcmp 函数是一个字符串比较函数,它接收两个参数:两个字符串字符数组,并将它们进行比较

include <stdio.h>
include <string.h>
int main() {
	char str1[15]="faker", str2[] = "China";
	int result = strcmp(str1, str2);  //比较str1和str2的字符串,依次按照ASCII码比较
	printf("%d", result);
			/*str1 = str2,则result=0
			  str1 > str2,则result为正整数	
			  str1 < str2,则result为负整数
			*/
}	

strlen

strlen函数用来获取字符串长度

include <stdio.h>
include <string.h>
int main()
{
	char str[10]="China";
	printf("%d,%d\n",strlen(str),strlen("China1"));	//strlen输出字符串长度,不包括\0,这里输出5,6
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab绘制隐函数总结-二维和三维

1.二维隐函数 二维隐函数满足f(x,y)0f(x,y)0f(x,y)0&#xff0c;这里无法得到yf(x)yf(x)yf(x)的形式。不能通过普通函数绘制。 我们要关注的是使用fplot函数和fimplicit函数。 第1种情况&#xff1a;基本隐函数 基本的隐函数形式形如&#xff1a; x2y22x2(x2y2)12x^{2}y^{…

【Qt】Qt 隐式共享

文章目录一、导读二、隐式共享简介三、源码角度分析隐式共享四、隐式共享在开发中的使用五、隐式共享迭代器问题六、隐式共享类和线程一、导读 在实际开发中&#xff0c;Qt中很多类可以直接作为函数参数传递&#xff0c;这样做是为了什么&#xff1f;其背后的实现机制又是什么…

进程,线程

进程是操作系统分配资源的基本单位&#xff0c;线程是CPU调度的基本单位。 PCB&#xff1a;进程控制块&#xff0c;操作系统描述程序的运行状态&#xff0c;通过结构体task,struct{…}&#xff0c;统称为PCB&#xff08;process control block&#xff09;。是进程管理和控制的…

#电子电气架构——Vector工具常见问题解决三板斧

我是穿拖鞋的汉子,魔都中一位坚持长期主义的工科男。 今天在与母亲聊天时,得到老家隔壁邻居一位大姐年初去世的消息,挺让自己感到伤感!岁月如流水,想抓都抓不住。想起平时自己加班的那个程度,可能后续也要自己注意身体啦。 老规矩,分享一段喜欢的文字,避免自己成为高知…

千锋教育嵌入式物联网教程之系统编程篇学习-03

目录 进程的终止 exit函数 _exit函数 进程退出清理 进程间的替换 进程间通信 常见通信机制 进程间通信的实质 信号 产生信号的方式 信号的默认处理方式 进程对信号的处理方式 kill函数 进程的终止 使用exit函数对进程进行终止&#xff0c;而return只是结束函数&a…

电子技术——共模抑制

电子技术——共模抑制 我们在之前学习过&#xff0c;无论是MOS还是BJT的差分输入对&#xff0c;共模信号并不会改变漏极电流的大小&#xff0c;因此我们说差分输入对共模信号无响应。但是实际上由于各种客观非理想因素&#xff0c;例如电流源有限阻抗等&#xff0c;此时共模是影…

LINUX提权入门手册

前言 发点存货 LINUX权限简介 在学习提权之前我们先了解一下linux里面的权限我们使用命令: ls -al即可查看列出文件所属的权限&#xff1a; 文件头前面都有一段类似的字符&#xff0c;下面我们仔细分析一下里面符号分别代表什么。 -rw-r--r-- 1 root root 第一个符号-的…

现代 cmake (cmake 3.x) 操作大全

cmake 是一个跨平台编译工具&#xff0c;它面向各种平台提供适配的编译系统配置文件&#xff0c;进而调用这些编译系统完成编译工作。cmake 进入3.x 版本&#xff0c;指令大量更新&#xff0c;一些老的指令开始被新的指令集替代&#xff0c;并加入了一些更加高效的指令/参数。本…

MongoDB--》MongoDB数据库以及可视化工具的安装与使用—保姆级教程

目录 数据库简介 MongoDB数据库的安装 MongoDB数据库的启动 MongoDB数据库环境变量的配置 MongoDB图形化管理工具 数据库简介 在使用MongoDB数据库之前&#xff0c;我们应该要知道我们使用它的原因&#xff1a; 在数据库当中&#xff0c;有常见的三高需求&#xff1a; Hi…

如何手写一个springboot starter?

本文主要分享了如何手写一个spring starter&#xff0c;把你的代码作为jar包进行开源。命名规则&#xff08;不要使用spring-boot开头&#xff0c;以避免将来spring-boot官方使用你的starter而重名&#xff09;官方命名格式为&#xff1a;spring-boot-starter-xxx非官方命名格式…

ucos-ii 的任务调度原理和实现

ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候&#xff0c;会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块&#xff08;OS_TCB&#xff09;等的操作&#xff1b; if (OSTCBPrioTbl[prio] (OS_…

Python中如何书写文件路径

当程序运行时&#xff0c;变量是保存数据的好方法&#xff0c;但变量、序列以及对象中存储的数据是暂时的&#xff0c;程序结束后就会丢失&#xff0c;如果希望程序结束后数据仍然保持&#xff0c;就需要将数据保存到文件中。Python 提供了内置的文件对象&#xff0c;以及对文件…

数据库 delete 表数据后,磁盘空间为什么还是被一直占用?

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 最近有个上位机获取下位机上报数据的项目&#xff0c…

计算机网络6:Http协议

目录HTTP1.基本概念1.1.1 URI2. 请求和响应报文2.1.请求报文2.2.响应报文3.HTTP报文实现细节3.1响应头主要字段3.2HTTP状态码3.3 HTTP方法3.3.1 GET方法3.3.2 HEAD3.3.3 POST3.3.4 PUT3.3.5 PATCH3.3.6 DELETE3.3.7 OPTIONS3.3.8 CONNECT3.4 HTTP首部&#xff08;头部&#xff…

【MT7628】开发环境搭建-Fedora12安装之后无法上网问题解决

1.按照如下图所示,打开Network Connections 2.点击Network Connections,弹出如下界面

面向对象程序(C++)设计基础

一、类&对象C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。类提供了对象的蓝图&#xff0c;所以基本上&#xff0c;对象是根据类来创建的。声明类的对象&#xff0c;就像声明基本类型…

面试题(二十二)消息队列与搜索引擎

2. 消息队列 2.1 MQ有什么用&#xff1f; 参考答案 消息队列有很多使用场景&#xff0c;比较常见的有3个&#xff1a;解耦、异步、削峰。 解耦&#xff1a;传统的软件开发模式&#xff0c;各个模块之间相互调用&#xff0c;数据共享&#xff0c;每个模块都要时刻关注其他模…

Grafana 系列文章(十五):Exemplars

Exemplars 简介 Exemplar 是用一个特定的 trace&#xff0c;代表在给定时间间隔内的度量。Metrics 擅长给你一个系统的综合视图&#xff0c;而 traces 给你一个单一请求的细粒度视图&#xff1b;Exemplar 是连接这两者的一种方式。 假设你的公司网站正经历着流量的激增。虽然…

ansible的模块详解

ansible 的概述 什么是ansible Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。 它用Python写成&#xff0c;类似于saltstack和Puppet&#xff0c;但是有一个不同和优点是我们不需要在节点中安装任何客户端。 它使用SSH来和节点进行通信。Ansible基于 Python…

Redux 源码分析

Redux 目录结构 redux ├─ .babelrc.js ├─ .editorconfig ├─ .gitignore …