C语言数组基础知识

目录

一维数组:

一维数组的创建:

一维数组的访问:

一维数组在内存中的存储:

二维数组:

二维数组的创建:

二维数组的初始化:

二维数组的使用:

二维数组在内存中的存储:

数组作为函数参数:

但是,数组名是首元素地址的情况有两个例外:

冒泡排序的实例应用:


一维数组:

一维数组的创建:

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

type_t arr_name[const_n];

type_t是指数组的元素类型

const_n是一个常量表达式(不能初始化变量n作为常量表达式,只有C99标准支持变长数组),用来指定数组的大小

int arr[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化
int arr[10]={1,2,3,4,5};//不完全初始化,后面的值为0;
int arr[]={1,2,3,4,5};   //等价于 int arr[5]={1,2,3,4,5};  
char ch[]={'b','i','t'};//三个元素
char ch[]=“bit”;//四个元素,因为字符串末尾自带'\0'
int main() {
	char ch1[] = "bit";
	char ch2[] = { 'b','i','t' };
	printf("%s\n", ch1);
	printf("%s\n", ch2);

	return 0;
}

这段代码的运行结果为:

原因是字符串“bit”中有结束字符‘\0’.而ch2中没有结束字符导致继续读取随机值(这种情况下求字符串长度也会出错)


一维数组的访问:

(1)数组是使用下标来访问的,下标是从0开始的

(2)数组的大小可以通过计算得到

int sz = sizeof(arr) / sizeof(arr([0]));

一维数组在内存中的存储:

//%p - 是按地址的格式打印 - 十六进制的打印
int main() {
	int arr[10] = { 0 };
	for (int i = 0; i < 10; i++) {
		printf("arr[%d]=%p\n", i, &arr[i]);
	}
	return 0;
}

这段代码运行结果为:

所以:

(1)一位数组在内存中是连续存放的(所以可以用指针访问)

(2)随着数组下标的增长,地址是由低到高变化的


二维数组:

二维数组的创建:

int arr [3][4];
char arr[3][4];


二维数组的初始化:

int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化

int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化

int arr[3][4] = { {1,2},{3,4},{5,6} };//每行填充两个元素
//因为初始化了三行,所以可以省略行数
//所以等价于int arr[][4] = { {1,2},{3,4},{5,6} };


二维数组的使用:

int main() {
	//int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化
	//int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化
	int arr[3][4] = { {1,2},{3,4},{5,6} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果为:


二维数组在内存中的存储:

int main() {

	int arr[3][4] = { {1,2},{3,4},{5,6} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			printf("arr[%d][%d]=%p\n", i,j,&arr[i][j]);
		}
	}
	return 0;
}

运行结果为:

所以:

(1)二维数组在内存中也是连续存放的(行内部连续,跨行也是连续的)

如图:

(2)二维数组也可以定义指针访问


数组作为函数参数:

数组作为函数参数传入,传入的是数组首元素的地址,等价于指针

int main() {
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);

	return 0;
}

运行结果为:

但是,数组名是首元素地址的情况有两个例外

(1)sizeof(数组名) 数组名表示整个数组-计算的是整个数组的大小,单位是字节

但在函数中接受传入的形参数组时,sizeof(形参数组)计算的是数组首地址元素的大小, 这一块具体可查看博主的相关博客C中关于能否在函数中求传入整型数组长度的问题

(2)&数组名 - 数组名表示整个数组 - 取出的是整个数组的地址(但与数组首元素地址一样,但意义不同),这一块具体可查看博主的相关博客C中数组名代表首元素地址的两个例外

冒泡排序的实例应用:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include<stdlib.h>
#include <stdbool.h> 
void bubble(int brr[], int len) {
	for (int i = 0; i < len - 1; i++) { //一共进行几趟冒泡排序
		bool flag = false;              //用于判断本趟冒泡排序是否发生了元素的交换
		for (int j = len - 1; j > i; j--) {//每趟冒泡排序要进行几次交换
			if (brr[j] > brr[j - 1]) {
				int tmp = brr[j - 1];
				brr[j - 1] = brr[j];
				brr[j] = tmp;             //交换元素
				flag = true;              //本趟排序发生了元素的交换
			}
			if (flag == false) {
				return;
			}
		}
	}
}
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, sz);
	for (int i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果为:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5 将类修改目录

有个需求&#xff0c;需要修改ue里面类的位置&#xff0c;默认在Public类下面&#xff0c;我想创建一个二级目录&#xff0c;将所有的类分好位置&#xff0c;方便查看。 上图为创建一个类所在的默认位置。 接下来&#xff0c;将其移动到一个新的目录中。 首先在资源管理器中找…

kubeSphere DevOps自定义容器环境JDK11

kubeSphere DevOps自定义容器环境JDK11 &#x1f342;前言&#x1f342;增加JDK11容器环境&#x1f341;检查是否成功 &#x1f342;不生效的原因排查&#x1f341;按步骤执行如下命令 &#x1f342;前言 kubeSphere 版本v3.1.1 遇到问题:kubeSphere默认支持容器只有JDK8,目前…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-3(1) 刚体的位形 Configuration of Rigid Body

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

接口测试管理续集

今天应大家需要&#xff0c;接着谈app端数据返回层面的用例设计方法。第二部分给大家安利一个“接口管理平台”&#xff0c;以帮助大家解决接口文档维护、接口测试数据Mock、接口自动化测试等问题。希望对小伙伴们有用。 言归正传&#xff0c;进入今天的话题。 一、用例设计 …

【大数据OLAP引擎】StartRocks存算分离

存算分离的原因 降低存储成本&#xff1a;同样的存储大小对象存储价格只有SSD的1/10&#xff0c;所以号称存储成本降低80%不是吹的。 存算一体到存算分离 存算一体 作为 MPP 数据库的典型代表&#xff0c;StarRocks 3.0 版本之前使用存算一体 (shared-nothing) 架构&#xf…

Flink任务实战优化

前言&#xff1a;一个好产品&#xff0c;功能应该尽量包装在服务内部&#xff1b;对于Flink而言&#xff0c;无疑是做到了这一点。但是用户在使用Flink的时候&#xff0c;依然可以从版本的选择、代码逻辑、资源参数、业务的数据情况等方面做任务级的定制化优化&#xff1b;用最…

OpenMv颜色识别

本文旨在分享OpenMv实现数字识别并通过串口打印出来的工程源码。如果大家想将识别的结果传给单片机&#xff0c;即OpenMv与单片机之间的通信&#xff0c;可以参考以下文章&#xff1a; OpenMV与STM32之间的通信&#xff08;附源码&#xff09;_openmv与stm32串口-CSDN博客 ​​…

webpack学习笔记

为什么要使用Webpack webpack是一个用于现代JavaScript应用程序的静态模块打包工具。在webpack里一切文件皆模块&#xff0c;通过loader转换文件&#xff0c;通过plugin注入钩子&#xff0c;最后输出由多个模块组合成的文件&#xff0c;webpack专注构建模块化项目。 webPack可以…

HTTPS详解及openssl简单使用

本文介绍https传输协议中涉及的概念&#xff0c;流程&#xff0c;算法&#xff0c;如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代&#xff0c;最大的原因就是不安全&#xff0c;至于为什么不安全&#xff0c;看了下面这张图就一目了然了 HTTP 在传输数据的过程…

pulsar的架构与特性记录

一、什么是云原生 云原生的概念是2013年Matt Stine提出的,到目前为止&#xff0c;云原生的概念发生了多次变更&#xff0c;目前最新对云原生定义为: Devps持续交付微服务容器 而符合云原生架构的应用程序是: 采用开源堆栈(K8SDocker)进行容器化&#xff0c;基于微服务架构提高灵…

java.net.ConnectException: Connection refused: connect已解决

&#x1f95a;今日鸡汤&#x1f95a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 —— 《枫》 遇见问题莫着急&#xff0c;着急也没用~&#x1f636;‍&#x1f32b;️ 目录 &#x1f9c2;1.令人发麻的问题 &am…

vue/vue3/js来动态修改我们的界面浏览器上面的文字和图标

前言&#xff1a; 整理vue/vue3项目中修改界面浏览器上面的文字和图标的方法。 效果&#xff1a; vue2/vue3: 默认修改 public/index.html index.html <!DOCTYPE html> <html lang"en"><head><link rel"icon" type"image/sv…

Logstash:迁移数据到 Elasticsearch

在生产环境中&#xff0c;不使用 Apache Kafka 等流平台进行数据迁移并不是一个好的做法。 在这篇文章中&#xff0c;我们将详细探讨 Apache Kafka 和 Logstash 的关系。 但首先让我们简单了解一下 Apache Kafka 的含义。 Apache Kafka 是分布式流平台&#xff0c;擅长实时数据…

Qt QRadioButton单选按钮控件

文章目录 1 属性和方法1.1 文本1.2 选中状态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的单选按钮类是QRadioButton它是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的单选按钮单选按钮常用在“多选一”的场…

【Python学习】Python学习12-字典

目录 【Python学习】Python学习12-字典 前言创建语法访问列表中的值修改与新增字典删除字典元素Python字典内置函数&方法参考 文章所属专区 Python学习 前言 本章节主要说明Python的字典&#xff0c;是可变的容器&#xff0c;每个字典由键值对组成用冒号隔开&#xff0c;…

预训练中文GPT2(包括重新训练tokenizer)

训练数据 1.json后缀的文件 2.数据是json line格式&#xff0c;一行一条json 3. json结构如下 {"content": "①北京和上海户籍的游客可获得韩国多次签证&#xff1b;②“整容客”可以不经由韩国使领馆、直接在网上申请签证&#xff1b;③中泰免签的实施日期…

SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客 设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例&#xff1a; 设计模式-单例模…

Android SDK环境搭建[图解]; 解决问题Done. Nothing was installed.

安装SDK Android SDK环境搭建 依赖java环境,需要自备Java环境 (100%实操成功) 目录 1. 解压&#xff1a;解压到非中文无特殊字符的目录 2. 双击&#xff1a;SDK Manager.exe&#xff0c;不要选全部!不要选全部!不要选全部!(会下很久) 3. 然后勾选组件​ 4. 设置环境变量 …

安装ubuntu22.04系统,GPU驱动,cuda,cudnn,python环境,pycharm

需要准备一个u盘&#xff0c;需要格式化&#xff0c;且内存不小于8g 1 下载ubuntu镜像 下载链接&#xff1a; https://cn.ubuntu.com/download/desktop 2下载rufus Rufus - 轻松创建 USB 启动盘Rufus: Create bootable USB drives the easy wayhttps://rufus.ie/zh/ 准备好这…

用Linux的视角来理解缓冲区概念

缓冲区的认识 缓冲区&#xff08;buffer&#xff09;是存储数据的临时存储区域。当我们用C语言向文件中写入数据时&#xff0c;数据并不会直接的写到文件中&#xff0c;中途还经过了缓冲区&#xff0c;而我们需要对缓冲区的数据进行刷新&#xff0c;那么数据才算写到文件当中。…