完全自学C(干货) —— 数组

06-数组 -c语言初学系列 ps:此教程配套ppt下载地址如下,如果需要可以下一下,不过其实也无所谓,这篇文章就是全部文本。输入A,B,C,D,E五个班学生的C语言成绩,求平均分(设每班30人)要定义30个变量,很麻烦,如果学生数量有1000个呢?程序L6_5.C :输入两个数,输出其中最大数。请输入30个同学C语言的成绩,求平均分。练习:求一个3×3矩阵对角线元素之和。6.1 一维数组的定义和引用。6.3 多维数组的定义和使用。练习:打印出以下的杨辉三角形。6.2 一维数组的初始化。6.4 数组作为函数参数。 阅读详情

目录

一,一维数组

二,二维数组

三,数组传参

四,案例


数组  

  • 一组相同类型元素的集合,可存储一系列相同类型的数据;
  • 在内存中,数据时依次挨着存放,彼此之间没有缝隙;
  • 数组属于构造类型;
  • 数组可分为,一维数组、二维数组等;

一,一维数组

一维数组的声明:

  • type name[size]
    • 包含:元素类型type,数组名name,元素个数size;
      • 元素类型,任意有效类型均可,也可数组类型;
      • 元素个数,必须是大于零的整数常量;
      • 数组类型为,tpye [size],是一种构造类型;
int main()
{
    char arr1[10]; //拥有10个字符的arr1数组
    int arr2[10]; //拥有10个整型的arr2数组
    double arr3[10]; //拥有10个浮点的arr3数组
    int* arr4[10]; //拥有10个指针类型的arr4数组

    //因为数组类型为type[size],所以可使用sizeof求其字节大小
    int sz1 = sizeof(char[10]); //10
    int sz2 = sizeof(int[10]); //40
    int sz3 = sizeof(double[10]); //80
    int sz4 = sizeof(int*[10]); //40
    return 0;
}
int main()
{
	int n = 10;
	int arr[n]; //报错,n必须是整数常量
    return 0;
}
//注:在C99标准下是支持n变量的,称为变长数组,即数组的大小是变量;
//VS2019,不支持

一维数组的初始化:

  • 在创建数组时,给数组赋予一些合理初始值;
  • 使用{}将值括起来,用逗号,分开;
  • 元素个数不可超出,相同时为完全初始化,小于时为不完全初始化;
    • 可完全初始化,即给每个元素均赋值;
    • 也可不完全初始化,即只给部分元素赋值,剩余会用0、\0或0.0替代;
    • 初始化时,可不指定数组的元素个数,其元素个数由初始化值确定;
int main()
{
    //完全初始化
    char arr1[5] = { 'a','b','c','d','e' };
    int arr2[5] = { 1,2,3,4,5, };
    int* arr3[5] = { arr2,arr2 + 1,arr2 + 2,arr2 + 3,arr2 + 4 };
    
    //不完全初始化
    char arr4[5] = { 'a','b' }; //其余为'\0'
    int arr5[5] = { 1,2 }; //其余为0
    double arr6[5] = { 1.5,2.5 }; //其余为0.0

    //可不指定元素个数
    int arr7[] = { 1,2,3,4,5, }; //元素个数为5个
    return 0;
}

注:

  • 如元素值均为0,或不知初始化何值,可直接简写为{0};
  • 除0可简写外,其他初始化同样值,均需写全;
int main()
{
	//所有元素初始化0
	char arr1[5] = { 0 };
	int arr2[5] = { 0 };

	//所有元素初始1
	int arr3[5] = { 1,1,1,1,1 };
	return 0;
}

一维数组元素的访问:

  • 数组使用 ”下标引用操作符[ ]“ 来访问的;
  • 形式为,数组名[元素下标],元素下标从0开始;
  • 可利用sizeof,求数组元素个数;
int main()
{
	int arr[5] = { 1,2,3,4,5, };

	//访问第三个元素
	int a = arr[2];
	arr[2] = 2;

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

一维数组内存存储形式:

  • 数组数据在内存中,是连续存储的;
    • 如上数组arr3,每个元素的大小为4个字节,所以元素间地址应该相隔4个字节;
  • 随着数组下标的增长,元素的地址为递增的;

二,二维数组

  • 数组的元素也为数组,即数组的数组;

二维数组的声明:

  • type name[size][size]
int main()
{
	int arr[2][3]; //一个数组有两个元素,其元素是有三个整型元素的数组
}

二维数组的初始化:

  • 初始化时,第一个[ ]内数字可省略;
int arr[2][3] = { {1,2,3},{4,5,6} }; //也可直接{1,2,3,4,5,6}

int arr[][3] = { {1,2,3},{4,5,6} }; 

二维数组元素的访问:

  • 形式为,数组名[下标][下标],元素下标从0开始;
int main()
{
	int arr[2][3] = { {1,2,3},{4,5,6} }; 

	int a = arr[1][2];
	arr[1][2] = 7;

	int sz = sizeof(arr)/sizeof(arr[0][0]); //等同于sizeof(int[2][3])/sizeof(arr[0][0])
    return 0;
}

二维数组内存存储形式:

  • 也是随着下标从低地址向高地址依次连续存储;

三,数组传参

数组作为函数的参数

  • 实际上是,将首元素的地址传递给参数;

两种形式:

  • 数组形式,如形参为int arr[ ],或int arr[ ][2];
    • [ ]内数字可省略(因为是地址所以无关);
    • [ ][2]只有前一个[ ]内数字可省略;
  • 指针形式,如形参为int* p;
    • int arr[3][2]指针形式为int (*arr)[2];
//形参为数组形式
//[]内写不写,写多少均不影响
void PrintArr1(int arr[], int sz) 
{
	int i = 0;
	for (i; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

//形参为指针形式
void PrintArr2(int* p, int sz)
{
	int i = 0;
	for (i; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}

int main()
{
	int arr[5] = { 1,2,3,4,5, };
	int sz = sizeof arr / sizeof arr[0];
	PrintArr1(arr, sz);
	PrintArr2(arr, sz);
	return 0;
}
//结果:1 2 3 4 5 1 2 3 4 5

注:

  • 数组传参实际传的是地址,所以sizeof求大小时,实际求的是地址的大小;
  • 此情况下,需在函数外计算好大小,在作为参数传递给函数;
void PrintArr(int arr[])
{
	int sz = sizeof arr / sizeof arr[0];
	printf("%d ", sz);
}

int main()
{
	int arr[5] = { 1,2,3,4,5, };
	PrintArr(arr);
	return 0;
}
//结果:1 

数组名含义:

  • 数组名为数组首元素的地址,即&arr[0];
  • 例外,sizeof arr 和 &arr ,此两数组名表示整个数组;
int main()
{
	char arr[5] = { 'a','b','c','d','e' };
	printf("%d ", sizeof(arr)); //5
	printf("%p %p ", &arr, &arr + 1); //00D5FC58 00D5FC5D 相差5
	printf("%p %p ", arr, arr + 1); //00D5FC58 00D5FC59 相差1
	return 0;
}

四,案例

1,冒泡排序;

//冒泡排序(依次比较排序),只针对整数int类型 
void bubbleSort(int arr[], int sz)
{
	//第一次循环,从首个元素依次比较交换位置,循环9次,(如是最大数则会排到最后一位)
	//第二次循环,再从首个元素依次比较交换位置,循环8次(最后一位无需比较了),(如是最大数则会排到倒数第二位)
	//依次循环,总共循环9次
	for (int i = 0; i < sz - 1; i++)
	{
        int flag = 1;
		for (int j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
                flag = 0;
			}
		}
        if(flag)
            break;
	}
}

//递归方式
void bubbleSort(int* arr, int sz)
{
	int flag = 1;
	for (int i = 0; i < sz - 1; i++)
	{
		if (arr[i] > arr[i + 1])
		{
			int tmp = arr[i];
			arr[i] = arr[i + 1];
			arr[i + 1] = tmp;
			flag = 0;
		}
	}
	if (sz > 1 && flag == 0)
		bubbleSort(arr, sz - 1);
}

2,三子棋(完整的VisualStudio文件需下载在VisualStudio打开);

3,五子棋(完整的VisualStudio文件需下载在VisualStudio打开);

4,扫雷(完整的VisualStudio文件需下载在VisualStudio打开);

Android14到Android16源码移植中的Bluetooth模块规范适配指南 本文详细解析了从Android14到Android16源码移植过程中Bluetooth模块的规范适配挑战,重点介绍了Android.bp配置差异及常见编译报错解决方案。针对代码规范检查、final字段声明、静态方法优化等核心问题提供实用修复方法,帮助开发者高效完成版本升级适配工作。 阅读详情

相关推荐

从d、q轴电流到电机性能:FOC控制中角度偏移的实战影响与调试策略

本文深入探讨了永磁同步电机FOC控制中d、q轴电流与角度偏移对电机性能的影响及调试策略。通过分析角度偏移导致的效率下降、电流异常等问题,提供了实用的四步调试法和参数优化技巧,帮助工程师有效提升电机控制精度和效率。

weixin_29264201的博客 294

C语言数组

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。内容:数组的作用,数组的声明,数组的初始化,访问数组元素,字符型数组,一维数组名,数组作为函数的参数,数组作为函数的返回值,二维数组,二维数组名。

novice_qing的博客 1262

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 286

c语言数组

笔记

qq_64032172的博客 2115

大专非科班拿下汇丰外包Java岗:我的TEKSystem面试全流程复盘(含IKM笔试真题)

本文详细记录了一位非科班大专生成功通过TEKSystem面试,拿下汇丰银行Java外包岗位的全过程。从IKM全英文笔试到技术面试,作者分享了7个关键转折点的实战经验,包括简历优化、技术考点、英语面试策略及薪酬谈判技巧,特别适合初级Java开发者参考。

weixin_30074763的博客 393

Unity线性空间下PSD透明贴图黑边问题:原理分析与三种解决方案

在计算机图形学中,颜色空间转换与Alpha混合是渲染管线的基础环节。伽马空间与线性空间的差异源于显示设备与人眼感知的特性,现代渲染引擎采用线性工作流以实现更真实的光照计算。然而,当图像处理软件(如Photoshop)导出的纹理数据与游戏引擎(如Unity)的预期格式不匹配时,就会引发技术问题,影响视觉保真度与开发效率。具体表现为,在线性空间下进行Alpha Blend混合时,带透明通道的纹理边缘常出现异常黑边或颜色失真,其核心根源在于纹理数据是否经过“预乘”处理与sRGB标记的解读冲突。这一问题的解决对于提

weixin_34198762的博客 379

【C语言】数组

数组一、什么是数组1.数组的定义2.数组的下标2.数组的使用 一、什么是数组 C语言中给了数组的定义:一组相同类型元素的集合 1.数组的定义 int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个整形数组,最多放10个元素 2.数组的下标 C语言规定:数组的每个元素都有一个下标,下标是从0开始的。 数组可以通过下标来访问的。 int arr[10] = {0}; //如果数组10个元素,下标的范围是0-9 2.数组的使用 #include <stdio.h&gt

weixin_45982450的博客 1444

s9keaz128 UART Bootloader 单片机篇(上)

网络上充斥着各种各样的串口升级方案,基本都是基于Y-Mode协议下载。采用这种升级方案学习还是可以,用在产品上还是有点欠缺。如下载完成后,需要把时间发送到设备就不好搞了。如下这个设备返回的信息,最后一项就是固件更新时间。固件名称: KEA128编译时间固件版本: 1.0.3硬件版本: 1.0.3产品序列号功能名称: App固件更新时间串口升级演示视频。

一人科技 1795

C语言 数组

C语言 数组一、一维数组1.1 一维数组的声明1.2 一维数组的初始化1.3 引用数组元素 数组:一组相同类型元素的集合 一、一维数组 1.1 一维数组的声明 元素类型 数组名[数组大小] 说明:数组大小一般为常量表达式,c99标准支持可变长数组,即大小可以使用变量表示 int arr[10]; //声明一个整形数组,数组有10个元素,数组名为arr 1.2 一维数组的初始化 初始化:在数组声明时为数组赋值 int arr1[5] = {1,2,3}; int arr2[5] = {1,2,3,4,5};

kjl167的博客 1802

50、压电微泵与技术设备驱动的研究分析

本文研究了压电微泵在弹性微通道中的流体流动特性及技术设备驱动的振动行为。通过建立轴对称流固耦合模型,利用FreeFem++进行数值模拟,分析了不同数量压电致动器和频率对微泵流量的影响,发现多个致动器按特定时序压缩可产生净正向流量,并提出了稳态流量的近似解析公式。同时,针对技术设备驱动系统,探讨了周期性负载引起的强迫振动特性,明确了共振条件及影响因素,并比较了主动、被动和优化设计等振动控制策略。最后展望了实验验证、多物理场耦合与智能控制等未来研究方向,为相关设备的优化设计与高效运行提供了理论支持。

convnet3designer的博客 148

一篇把 Transport 做到可复制的实战指南:从 CTS 底层表到 LSMW、Variant、Layout、TABU、Query、SAPscript 全对象搬运

本文深入解析SAP系统中的Transport机制,将其视为可审计、可追溯的变更流水线。文章从CTS/Transport Organizer通用方法论和具体对象搬运手法两个层面展开,详细介绍了LSMW项目、程序Variant、屏幕/ALV Layout、表数据、ABAP Query、SAPscript和SO10标准文本等对象的传输策略。通过真实案例说明,代码对象往往能被正确传输,但"运行体验"和"业务配置"却常被遗漏,导致QAS测试正常而PRD环境异常。文章提供了一套可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 170

完全自学C(干货) —— 指针进阶

字符指针; 数组指针/指针数组; 数组传参/指针传参; 函数指针/函数指针数组; 指向函数指针数组的指针; 回调函数

NapoleonCoder的博客 330

华为OD机试双机位C卷-虚拟文件系统(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【虚拟文件系统】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【虚拟文件系统】。

qq_45776114的博客 476

完全自学C(干货) —— 指针初识

指针即内存地址(编号);

NapoleonCoder的博客 356

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

0基础Java自学之路

前言 最近逛知乎的时候,经常看到有人在问“0基础如何自学Java”、“干了几年**,想转行干Java靠谱吗”等问题。不禁让我回想起了自己当初自学Java的日子,因此在这个周末花了点时间,整理了这篇文章,希望对这些正打算自学Java的或者打算转行Java的人有点帮助。 我的自学之路 先告诉你们我的自学过程可能让你们有点参考。 大三的时候,班主任请了2个已经拿到offer的实验室同学来跟...

程序员囧辉 3万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

完全自学C(干货) —— 动态内存管理

对事先不确定的内存大小可使用动态内存函数;

NapoleonCoder的博客 392

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

完全自学C(干货) —— 结构体初识

是一些值的集合,这些值被称为成员变量;

NapoleonCoder的博客 344

完全自学C(干货) —— 选择、循环结构

顺序结构,选择结构,循环结构;

NapoleonCoder的博客 471

0基础C语言自学教程——第八节 函数指针数组的各种关系

写在前面: 各位小伙伴还在为C语言的学习而苦恼嘛? 还在为没有知识体系而烦心嘛? 别急。因为~~~~ 接下来的时间里,我会持续推出C语言的有关知识内容。 都是满满的干货,从零基础开始哦~,循序渐进????,直至将C中知识基本全部学完????。 欢迎关注我♥,订阅专栏 0基础C语言保姆教学, 就可以持续读到我的文章啦????????~~~~ 本文为第8节——函数指针数组的各种关系(文末附前7章的链接呦????) 编者按: 目录 1、const int* int const*

jxwd的博客 801

完全自学C(干货) —— 库函数qsort

库函数qsort的模拟实现!

NapoleonCoder的博客 278

完全自学C(干货) —— 自定义类型

结构体是一些值的集合,称为成员变量;内存对齐;段位;

NapoleonCoder的博客 389

完全自学C(干货) —— 数据的存储

原反补码,(-1)^S * M * 2^E;

NapoleonCoder的博客 376

0基础C保姆自学 第二节——初步认识C语言的全部知识框架

在看本章节前,请确保已经掌握了第一节的内容呦。不懂的欢迎在评论区留言~~~~ 本节定位:初步了解认识一下C中的知识,所有的知识都是点到为止。目的是在接下来章节的介绍中笔者的举例读者可以更好的接受。比如在函数的介绍中我们会用到指针。 所有的知识点我们会在接下来的章节一一详细介绍,读者在阅读本章的时候,只需要知道有这么个东西,并且能够理解笔者所说的含义即可。 本节我们将沿着上一节介绍: 本节内容有: 数据类型; 常量和变量; 字符串; 转义字符; 代码注释; 数组; 函数; 选择语句;

jxwd的博客 1万+

完全自学C(干货) —— 字符(串)函数

字符(串)库函数!

NapoleonCoder的博客 407

完全自学C(干货) —— 数据类型初识

数据类型,定义了数据的类别,用来如何解释数据,以及是怎样开辟内存,访问内存的;

NapoleonCoder的博客 388

完全自学C(干货) —— 操作符(一)

操作符

NapoleonCoder的博客 322
上一篇: 完全自学C(干货) —— 递归
下一篇: 完全自学C(干货) —— 调试
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值