C语言-学习之路-04

news2024/12/26 0:26:00

C语言-学习之路-04

          • 数组与字符串
          • 一维数组
            • 一维数组的定义和使用
            • 一维数组的初始化
            • 数组名
            • 一维数组练习
          • 二维数组
            • 二维数组的定义和使用
            • 二维数组的初始化
            • 数组名
          • 字符数组与字符串
            • 字符串的输入输出
            • 随机数
            • 字符串处理函数

数组与字符串

数组:为了方便处理数据把具有相同类型的若干变量按有序形式组织起来。
数组就是在内存中连续的相同类型的变量空间。同一个数组的所有成员都是相同的数据类型,同时所有成员在内存中的地址也是连续的。
在这里插入图片描述
数组属于构造数据类型:

  • 一个数组可以分解为多个数组元素;这些数组元素可以是基本数据类型或构造类型。
    ( int a[20]; struct Stu boy[10]; )
  • 按数组元素类型的不同,数组可分为:数值数组、字符数组、指针数组、结构数组等类别。
    ( int a[10]; char s[10]; char *p[10]; )
    一般情况下,数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组等。通常称二维及以上的数组为多维数组。
一维数组
一维数组的定义和使用
  • 数组名字应付哈标识符规定(数字、字母、下划线)。
  • 数组名不能与其他变量相同,同一作用域内是唯一的。
  • [] 中常量表达式表示数组元素个数。(下标从0开始计算)
  • 定义数组时[]内最好用常量,使用数组时[]内可以是常量,也可以是变量。
    如下所示:
#include <stdint.h>
int main()
{
	int a[5];//定义数组a ,内有5个成员,每个成员都是int型数据
	//下标从0开始,a[0]、a[1]、a[2]、...、a[4]
	//没有a这个变量,a只是数组名字,但不是变量,它是常量。
	a[0] = 0;
	a[1] = 1;
	a[4] = 4;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		a[i] = i;  //for语句下,给数组a赋值。
	}

	//遍历数组,并输出数组中每个成员的值
	for (i = 0; i < 5; i++)
	{
		printf("%d\n",a[i]);
	}
	return 0;
}
一维数组的初始化

在定义数组的同时进行赋值,称为初始化。全局数组若不初始化,编译器将其初始化为0.局部数组若不初始化,内容为随机值。

	int a[5] = { 1,2,3,4,5 }; //初始化数组,并同时赋值
	int a[5] = { 1,2,3 }; //只初始化前三个值,后面的成员默认设置为0
	int a[5] = { 0 }; //所有成员都设置为0
	int a[] = {1,2,3,4,5}//初始化时,如果[] 没有填写具体值,成员值必须初始化。
数组名

数组名只是一个地址的常量,代表数组中首元素的地址。

#include <stdint.h>
int main()
{
	int a[5] = { 1,2,3,4,5 };

	printf("a=%p\n",a);
	printf("&a[0]=%p\n",&a);

	int n = sizeof(a); //  数组a所占用内存的大小,5个int类型的成员,5*4=20
	int n0 = sizeof(a[0]); // 数组a第一个成员的占用内存大小,即第0个元素,int  =4
	
	int i = 0;
	for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("%d\n",a[i]);
	}
	return 0;
}
一维数组练习
  1. 一维数组中的最值问题:
#include <stdint.h>
int main()
{
	int a[10] = { 6,1,8,2,9,3,-4,5 ,4,-2};
	int i = 0;
	int max = a[0];
	for (i = 0; i < 10; i++)
	{
		if (a[i] > max)
		{
			max = a[i];
		}
	}

	printf("max=%d\n",max);

	return 0;
}
  1. 一维数组的逆置
#include <stdint.h>
int main()
{
	int a[10] = { 6,1,8,2,9,3,-4,5 ,4,-2};
	int i = 0;
	int j = sizeof(a) / sizeof(a[0]) - 1;
	while (i < j)
	{
		int temp = a[i];
		a[i] = a[j];
		a[j] = temp;
		i++;
		j--;
	}

	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("%d\n", a[i]);
	}

	return 0;
}
  1. 冒泡排序法
#include <stdint.h>
int main()
{
	int a[10] = { 6,1,8,2,9,3,-4,5 ,4,-2};
	int i = 0;
	int n = sizeof(a) / sizeof(a[0]) ;
	for (i = 0; i < n; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (a[j] > a[j+1])
			{
				int temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}

	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("%d\n", a[i]);
	}

	return 0;
}
二维数组
二维数组的定义和使用

二维数组的一般形式:
类型说明符 数组名 [维度1] [维度2] 例:int a[2][3]
在这里插入图片描述
从计算机内存的角度上看,其实没有二维数组,本质上还是一维数组。而二维数组其实是将第一行的数据后,再放入第二行的数据,直至全部放入。其内存地址仍然是连续的!

#include <stdint.h>
int main()
{
	int a[3][4];
	int num = 0;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			a[i][j] = num++;
		}
	}

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("%d\n",a[i][j]);
		}
	}
	return 0;
}
二维数组的初始化
#include <stdint.h>
int main()
{
	//方式一
	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,2,3,4,5,6,7,8,9,10,11,12 };

	//方式三
	int a[3][4] = { 1,2,3,4,5,6,7, }; //部分赋值初始化,未初始化的,默认为0.

	//方式4
	int a[3][4] = { 0 };//全部为0

	//方式5  //不建议使用!有些编译器会直接报错
	int[][4] = { 1,2,3,4,5,6,7,8 }; //如果存在[]为空,定义时必须初始化。
	return 0;
}
数组名

数组名是一个地址的常量,代表数组中首元素的地址。

#include <stdint.h>
int main()
{	
	//二维数组a
	//二维数组本质上还是一维数组,int a[3][4]  中有3个一维数组,每个 一维数组又有4个元素。
	int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };	

	printf("%p\n", a);  //数组名 a是数组首元素的地址,二维数组的第0个元素为一维数组
	printf("%p\n", a[0]);//第0个一维数组的数组名为a[0]

	//使用sizeof计算二维数组所占用的内存空间
	printf("sizeof(a) = %d\n",sizeof(a));

	printf("sizeof(a[0])=%d\n",sizeof(a[0]));

	printf("sizeof(a[0][0]=%d\n",sizeof(a[0][0]));

	printf("行数=%d\n", sizeof(a) / sizeof(a[0]));

	printf("列数=%d\n", sizeof(a[0]) / sizeof(a[0][0]));

	printf("行数*列数=%d\n", sizeof(a) / sizeof(a[0][0]));
	
	return 0;
}
字符数组与字符串

由于C语言中并没有字符串数据类型,但可以通过数组的方式来代替。例如:char a[]
在C语言中,字符串一定是用char数组来常见,但char数组并不一定就是字符串!
数字0(和字符’\0’等价)结尾的char数组就是一个字符串。如果char数组没有以数字0结尾,那么char数组就只是一个字符数组,不是字符串!
不以‘\0’结尾:
在这里插入图片描述
以’\0‘结尾:
在这里插入图片描述
另外一种方式:

#include <stdint.h>
int main()
{	
	char c[] = {"hello"};
	printf("%s\n", c);
	return 0;
}
字符串的输入输出
#include <stdint.h>
int main()
{	
	char str[100];
	printf("请输入字符串:");
	scanf_s("%s",str); //默认以空格分隔
	printf("字符串:%s",str);
	return 0;
}

随机数

获取随机数,首先要添加头文件!

	time_t time(time_t * t);  //获取当前系统时间

	void srand(unsigned int seed);  //用来设置rand()产生随机数时的随机种子

	int rand(void);  //返回一个随机数
#include <stdint.h>
#include <time.h>
#include <stdlib.h>

int main()
{	
	time_t tm = time(NULL);//获取当前系统时间
	srand((unsigned int)tm);//设置随机种子

	int t = rand();
	printf("t=%d\n", t); //获取随机数
	return 0;

}

在这里插入图片描述

字符串处理函数

常用的字符串处理函数有:(后续用到再解释)

  • gets();
  • fgets();
  • puts();
  • fputs();
  • strlen();
  • strcpy();
  • strncpy();
  • strcat();
  • strncat();
  • strcmp();
  • strncmp();
  • sprintf();
  • sscanf();
  • strchr();
  • strstr();
  • strtok();
  • atoi();

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

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

相关文章

等保工作的定级指南文件

定级主要依据国家标准信息安全技术网络安全等级保护基本要求来整改。有关等保工作流程和明细,请见:https://luozhonghua.blog.csdn.net/article/details/130465356?spm=1001.2014.3001.5502 5网络安全等级保护概述 5.1等级保护对象 等级保护对象是指网络安全等级保护工作中…

微服务注册中心-Nacos概述

1、Nacos基本介绍 1.1. 什么是 Nacos&#xff1f; Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮…

详解Transformer (Attention Is All You Need)

先导知识 Attention残差网络Layer Normalization 前言 注意力&#xff08;Attention&#xff09;机制[2]由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域&#xff0c;例如在计算机视觉方向用于捕捉图像上的感受野&#xff0c;或者NLP中用于定位关键token…

kvm GPU直通/GPU透传 之修改Windows虚拟机分辨率

为了方便对服务器进行自动管理,我们需要对硬件进行虚拟化。对于显卡而言,Nvidia有专门支持GPU虚拟化的显卡,比如GRID GPU系列。以NVIDIA GRID K2为例,显存8GB,可虚拟出2块GPU。 对于GTX系列的显卡,如果Host主机为linux系统,想将显卡给虚拟机(windows或者linux)使用,…

函数的栈帧与销毁(栈帧可不是战争哦)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将C语言知识一网打尽&#xff0c;希望可…

码出高效:Java开发手册笔记(java对象四种引用关系及ThreadLocal)

码出高效&#xff1a;Java开发手册笔记&#xff08;java对象四种引用关系及ThreadLocal&#xff09; 前言一、引用类型二、ThreadLocal价值三、ThreadLocal副作用 前言 “水能载舟&#xff0c;亦能覆舟。”用这句话来形容 ThreadLocal 最贴切不过。ThreadLocal 初衷是在线程并…

《C和指针》笔记3:置一和清零

在C语言中&#xff0c;移位运算符<<和>>表示二进制数左移或右移&#xff0c;我们可以利用它们很轻松地对变量中单个位进行置一和清零。 我们可以规定变量二进制数最右边一位是第0位&#xff0c;定义bit_number是0&#xff0c;对应地&#xff0c;从最右边一位往左数…

iOS开发系列--打造自己的“美图秀秀”

--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果&#xff0c;一方面得益于成功系统的设计&#xff0c;另一方面得益于它强大的开发框架。今天我们将围绕iOS中两大图形、图像绘图框架进行介绍&#xff1a;Quartz 2D绘制2D图形和Core Image中强大的滤镜功能…

【OpenVinoSharp】基于C#和OpenVINO部署PaddleOCR模型

基于C#和OpenVINO部署PaddleOCR模型 1.OpenVINO2.PaddleOCRPP-OCRv2PP-OCRv3 3.模型下载与转换3.1 Detection model3.2 Direction classifier3.3 Recognition model 4.OpenVinoSharp安装4.1 获取OpenVinoSharp源码4.2 配置OpenVINO依赖项 5. PaddleOCR5. 1模型推理C#实现&#…

Kali 安装中文输入法(超详细)

1.进入管理员下的控制台。 2. 输入密码后点击“授权”。 3.在控制台内输入下面的命令。 apt install fcitx 4.敲击回车后会开始安装&#xff0c;这里输入“y”。 5.回车后会继续进行安装&#xff0c;安装完成后会自动停止。 6.输入下面的命令来安装google输入法。 apt-get in…

【Python】【进阶篇】22、Django模板加载与响应

目录 22、Django模板加载与响应1. 什么是模板1) 模板的配置2) 修改settings配置文件 2. 模板的加载与响应方式3. render方法详解 22、Django模板加载与响应 在前文章节《Django模板系统》中&#xff0c;我们对 Django 的模板系统有了初步的认识&#xff0c;在本章我们将重点讲…

mongodb v4.4.19 分片精进实操,吐血分享

第一步&#xff1a;创建文件夹&#xff0c;data1111存放config server,data2222/data3333存放shard 第二步&#xff1a;启动服务 2.1 启动config server 2.2 启动shard --port 设置端口 --dbpath 设置数据库路径 --logappend 使用追加的方式写日志 --replS…

ReentrantLock原理剖析

前言 本文主要讲解底层逻辑&#xff0c;基本不会贴代码&#xff0c;目的是让大家能够真正的知晓原理&#xff0c;对照着逻辑去理解代码看代码也会很快就能看懂。 在讲ReentrantLock原理之前&#xff0c;我们先回顾下ReentrantLock的基本用法。ReentrantLock是一个锁编程api&am…

Compiler Lab2- 自制极简编译器

笔者实现的这个超级迷你版编译器&#xff08;词法分析、语法分析、生成中间代码&#xff08;cpp&#xff09;&#xff09;仅支持四则运算&#xff0c;功能真的是非常非常简单&#xff0c;不过其中的流程&#xff08;词法分析 -> 语法分析 -> 中间代码生成&#xff09;还是…

各SQL引擎的SQL转换过程对比

SQL引擎 参考文档:高级语言的解析过程—解析树 从 MySQL、Oracle、TiDB、CK,到 Hive、HBase、Spark,从关系型数据库到大数据计算引擎,他们大都可以借助 SQL 引擎,实现 “接受一条 sql 语句然后返回查询结果” 的功能。 他们核心的执行逻辑都是一样的,大致可以通过下面…

【五一创作】《嵌入式系统》知识总结7:GPIO寄存器

总述 每组端口具有7个寄存器 • 实现对GPIO端口初始化配置和数据输入输出控制 1. 配置寄存器&#xff1a;GPIOx_CRL、GPIOx_CRH 用来选择引脚功能&#xff0c;例如输入或输出 2. 数据寄存器&#xff1a;GPIOx_IDR、GPIOx_ODR 用来保存引脚输入电平或输出电平 3. 位控寄存器…

数据库管理-第七十一期 五一,休息?(20230503)

数据库管理 2023-05-03 第七十一期 五一&#xff0c;休息&#xff1f;1 备份2 两个DDL3 问题处理4 问题排查总结 第七十一期 五一&#xff0c;休息&#xff1f; 好不容易&#xff0c;熬过万恶的6天班来到了五一假期&#xff0c;想着好好休息&#xff0c;顺便把绝地幸存者给通关…

Java 基础进阶篇(九)—— 常用 API

文章目录 一、Object 类二、Objects 工具类三、Math 类四、System 类五、BigDecimal 类 一、Object 类 一个类要么默认继承了 Object 类&#xff0c;要么间接继承了 Object 类&#xff0c;Object 类是 java 中的祖宗类。Object 类的方法是一切子类都可以直接使用的。 因此&…

Obsidian +Obsidian Git插件 + Gitee 自动同步笔记

在Obsidian 关闭安全模式 然后再插件市场里面搜索并下载Obsidian Git 这个插件 注意&#xff1a;这里需要科学上网才能搜索并下载&#xff0c;我看很多博主都没说这件事情 然后再你的Gitee中&#xff0c;新建一个仓库 把这两个勾选上&#xff0c;然后随便选个语言&#xff0…

【JavaEE】应用层UDP协议

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本篇文章将为大家介绍应用层中UDP协议~~ 在应用层这里&#xff0c;虽然存在一些现有的协议&#xff08;HTTP&#xff09;&#xff0c;但是也有很多情况&#xff0c;需要程序猿自定制协议&a…