C语言学习笔记之数组篇

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

目录

一维数组

数组的创建

数组的初始化

数组的使用

数组在内存中的存储

二维数组

数组的创建

数组的初始化

数组的使用

数组在内存中的存储

数组名

数组名作函数参数


一维数组

数组的创建

type_t  arr_name  [const_n];
//type_t 是指数组的元素类型
//arr_name是数组的名字,命名遵循C语言命名规则
//const_n 是一个常量表达式,用来指定数组的大小

数组的初始化

        数组初始化时可以不指定数组大小,此时初始化的元素个数就是数组的大小。

        在指定数组的大小后,如果初始化的元素个数小于数组元素的个数,则剩余元素初始化为0。(元素与元素之间用 , 隔开)

int arr1[] = { 1, 2, 3, 4};
int arr2[5] = { 1,2,3,4,5 };
int arr3[10] = { 1, 2, 3 };

        初始化字符数组时,要用 ' ' 将要初始化的字符括起来或者用字符对应的ASCII码初始化。

char arr4[3] = { 'a', 98, 'c'};
char arr5[] = { 'a', 'b', 'c'};

        可以用一个 "字符串" 初始化字符数组,此时数组结尾默认加一个字符串结束标志 '\0'(数组大小必须大于等于字符串字符个数加1)

char arr6[] = "abcdef";
char arr7[] = "";

数组的使用

        可以通过下标引用操作符 [ ] (创建数组时的 [ ] 不是下标引用)用下标访问数组元素。对于一个有 n 个元素的数组,数组元素下标从0开始,到 n - 1 结束。

#include <stdio.h>int main()
{int arr[10] = { 0 };int i = 0;//遍历数组for (i = 0; i < 10; i++){printf("%d ", arr[i]);}printf("\n");//给数组每个元素赋值for (i = 0; i < 10; i++){arr[i] = i;}//打印下标为5的数组元素值printf("%d\n", arr[5]);//遍历数组for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

        数组的大小可以通过关键字 sizeof 计算获得。(sizeof用来计算类型大小)。

#include <stdio.h>int main()
{int arr[10] = { 0 }; //此数组类型:int[10], 每个数组元素的类型:intint sz = sizeof(arr) / sizeof(arr[0]);printf("%d\n", sz);return 0;
}

数组在内存中的存储

        数组在内存中是连续存放的(低地址到高地址)。

#include <stdio.h>int main()
{int arr[10] = { 0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; ++i){printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;
}

二维数组

数组的创建

type_t  arr_name  [const_n1][const_n2];
//type_t 是指数组的元素类型
//arr_name是数组的名字,命名遵循C语言命名规则
//const_n1 是一个常量表达式,用来指定数组的行数
//const_n2 是一个常量表达式,用来指定数组的列数

数组的初始化

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

        先初始化完一行,才会初始化下一行,如果初始化的元素个数小于数组元素的个数,则剩余元素初始化为0。

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

        可以用 { } 初始化指定行。

int arr1[][4] = { 1, 2, 3, 4, 5 };
int arr2[][4] = { {2, 3},{4, 5} };

        二维数组如果有初始化,行可以省略,列不能省略。 (原因在二维数组在内存中的存储)

数组的使用

        二维数组的使用与一维数组类似,也是通过下标来访问的(行和列下标都是从0开始)。

#include <stdio.h>int main()
{int arr[3][4] = { 0 };int i = 0;//赋值for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){arr[i][j] = i * 4 + j;}}//打印for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%-2d ", arr[i][j]); //%-2d:右对齐,不够两位数补空格}printf("\n");}return 0;
}

数组在内存中的存储

        二维数组在内存中也是连续存放的(低地址到高地址)。

#include <stdio.h>int main()
{int arr[3][4];int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

        因此对于二维数组,我们也可以这样理解:二维数组就是每个元素是一维数组的数组。

         因为二维数组在内存中连续存放,所以二维数组的行可以省略,列不能省略,因为如果省略了列,就无法确定每一行有多少个元素,从而不知道下一行的起点。

数组名

        无论是一维数组还是二维数组,数组名都表示的是首元素的地址。(两种例外情况:&数组名sizeof(数组名)中数组名表示的是整个数组)

#include <stdio.h>int main()
{int arr1[10];int arr2[3][4];printf("&arr1[0] = %p\n", &arr1[0]); //打印首元素的地址printf("arr1 = %p\n", arr1);printf("&arr2[0][0] = %p\n", &arr2[0][0]); //打印首元素的地址printf("arr1 = %p\n", arr1);return 0;
}

&数组名:

#include <stdio.h>int main()
{int arr1[10];int arr2[3][4];printf("arr1 = %p, arr1 + 1 = %p, &arr1[1] = %p\n",arr1, arr1 + 1, &arr1[1]);printf("arr2 = %p, arr2 + 1 = %p, &arr2[1][0] = %p\n", arr2, arr2 + 1, &arr2[1][0]);printf("&arr1 = %p, &arr1 + 1 = %p, &arr1[1] = %p\n", &arr1, &arr1 + 1, &arr1[1]);printf("&arr2 = %p, &arr2 + 1 = %p, &arr2[1][0] = %p\n", &arr2, &arr2 + 1, &arr2[1][0]);return 0;
}

sizeof(数组名):

#include <stdio.h>int main()
{int arr1[10];int arr2[3][4];printf("sizeof(arr1[0]) = %d, sizeof(arr1) = %d\n", sizeof(arr1[0]), sizeof(arr1));printf("sizeof(arr2[0][0]) = %d, sizeof(arr2) = %d\n", sizeof(arr2[0][0]), sizeof(arr2));return 0;
}

数组名作函数参数

void test1(int arr[]) //因为数组名表示首元素地址,所以等价于void test(int* arr)
{}void test2(int arr[][4])//二维数组行可以省略,列不能省略,等价于void test2(int (*arr)[4])//数组指针(指针篇)
{}#include <stdio.h>int main()
{int arr1[10];int arr2[3][4];test1(arr1);test2(arr2);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机制作数字频率计

文章目录 简介设计思路工作原理Proteus软件仿真软件程序实验现象测量误差和范围总结 简介 数字频率计是能实现对周期性变化信号频率测量的仪器。传统的频率计通常是用很多的逻辑电路和时序电路来实现的&#xff0c;这种电路一般运行较慢&#xff0c;而且测量频率的范围较小。这…

java--抽象类的常见应用场景:模板方法设计模式

1.模板方法设计模式解决了什么问题&#xff1f; ①解决方法中存在重复代码的问题。 2.模板方法设计模式的写法 1、定义一个抽象类。 2、在里面定义2个方法 ①一个是模板方法&#xff1a;把相同代码放里面去。 ②一个是抽象方法&#xff1a;具体实现交给子类完成。 分析&…

前端项目环境的搭建

一、下载并且安装Node&#xff08;不安装node&#xff0c;就安装nvm。nvm安装教程&#xff09;&#xff1a; 1.官网下载Node&#xff1a;https://nodejs.org/en/ 2.测试nodejs安装是否成功&#xff1a; 在windows powerShell中输入node -v 和 npm -v&#xff0c;看到版本号就…

Python编程技巧:多层for循环的高级应用

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python的for循环结构是编程中最基础也是最常用的控制结构之一。通过for循环&#xff0c;可以轻松遍历数据集合和执行重复的操作。然而&#xff0c;当我们面对多层for循环时&#xff0c;性能和可读性可能会成为挑…

【Vue】Linux 运行 npm run serve 报错 vue-cli-service: Permission denied

问题描述 在Linux系统上运行npm run serve命令时&#xff0c;控制台报错&#xff1a; sudo npm run serve project50.1.0 serve vue-cli-service serve sh: 1: vue-cli-service: Permission denied错误截图如下&#xff1a; 原因分析 该错误是由于vue-cli-service文件权限不…

Java中的Future源码讲解

JAVA Future源码解析 文章目录 JAVA Future源码解析前言一、传统异步实现的弊端二、what is Future ?2.1 Future的基本概念2.2Future 接口方法解析2.2.1 取消任务执行cancel2.2.2 检索任务是否被取消 isCancelled2.2.3 检索任务是否完成 isDone2.2.3 检索任务计算结果 get 三、…

系统运维安全之病毒自检及防护

一、前言 Linux勒索病毒&#xff08;Linux ransomware&#xff09;是一种最令人恶心的计算机恶意病毒&#xff0c;它以侵入Linux系统&#xff0c;捆绑文件并要求支付赎金才能释放文件为主要目的&#xff0c;破坏用户的数据&#xff0c;造成数据讹诈。Linux勒索病毒它们的存在已…

全网最新最全面的Appium自动化:Appium常用操作之app操作

APP操作方法: appium支持对手机上的app进行管理和操作&#xff0c;有如下方法&#xff1a; 1、install_app(self,app_path,**options): 安装app,app_path为安装包路径 2、remove_app(self,app_id,**options): 卸载app&#xff0c;app_id为app包名 3、is_app_installed(self,b…

VScode异常处理 (因为在此系统上禁止运行脚本)

在使用 VScode 自带程序终端的时候会报出"系统禁止脚本运行的错误" 这是由于 Windows PowerShell执行策略导致的 解决办法 管理员身份运行 Windows PowerShell执行&#xff1a;get-ExecutionPolicy1&#xff0c;显示Restricted2执行&#xff1a;Set-ExecutionPoli…

一文带你了解Java中synchronized原理

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是Java中 synchronized 的基本原理 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff…

国产接口测试工具APIpost

说实话&#xff0c;了解APIpost是因为&#xff0c;我的所有接口相关的文章下&#xff0c;都有该APIpost水军的评论&#xff0c;无非就是APIpost是中文版的postman&#xff0c;有多么多么好用&#xff0c;虽然咱也还不是什么啥网红&#xff0c;但是不知会一声就乱在评论区打广告…

MobaXterm连接相关

其实最终解决的方法&#xff0c;还是&#xff0c;因为要远程连接的是个局域网ip&#xff0c;我所在的ip和要连接的这个不在同一个局域网内&#xff0c;需要实验室搭的VPN才行。 甚至&#xff0c;我连防火墙都没关&#xff0c;也可以连接 至于修改密码&#xff0c;passwd&#…

沐风老师3DMAX键盘球建模方法详解

3DMAX键盘球建模教程 本教程给大家分享一个3dMax键盘球的建模方法过程。在学习本教程之前&#xff0c;大家需要对3dMax基本操作及建模知识有所掌握&#xff0c;还是那句话&#xff1a;做实例的前提是选学习基础知识和掌握3dMax的基本操作。 下面就给大家一步一步讲解演示3dMax…

Graphpad Prism10.1.0 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

python socket编程7 - 使用PyQt6 开发UI界面新增实现UDP server和client单机通讯的例子

在第五篇中&#xff0c;简单实现了命令行下的 TCP/UDP server和client的单机通讯。 在第六篇中&#xff0c;实现了PyQt6开发界面&#xff0c;TCP协议实现的单机server和client的通讯功能。 这一篇&#xff0c;在第六篇的基础上&#xff0c;增加了UDP server和client的单机通讯功…

四川云汇优想:抖音直播等级怎么升级?

抖音直播&#xff0c;作为当前最热门的社交平台之一&#xff0c;其等级体系一直备受用户关注。如何在抖音直播中迅速提升等级&#xff0c;成为众多用户探讨的话题。在这篇文章中&#xff0c;我们将深入探讨抖音直播等级的升级机制、好处以及一些实用的技巧&#xff0c;助你在抖…

三、C语言常见概念

目录 1. C语言是什么&#xff1f; 3. 编译器的选择 3.1 编译和链接 3.2 编译器的对比 6. main函数 7. printf 和 库函数 8. 关键字介绍 8.1 什么是预编译&#xff1f; 8.2 static 的关键词作用&#xff1f; 8.3 const 的作用 8.4 voliate 的作用 8.5 typedef 的作用…

吉他初学者学习网站搭建系列(5)——如何做一个在线节拍器

文章目录 背景实现TransportLoop代码 在线尝试 背景 我们看吉他谱时&#xff0c;经常看到拍号&#xff0c;例如6/8。它的含义是一拍是一个八分音符&#xff0c;一小节有六拍。四分音符的时长是一秒&#xff0c;即60拍/分钟。基于这样的背景知识&#xff0c;我们就可以根据一些…

基于springboot的校园二手市场

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

vFW搭建IRF

正文共&#xff1a;2328字 40图&#xff0c;预估阅读时间&#xff1a;5 分钟 IRF&#xff08;Intelligent Resilient Framework&#xff0c;智能弹性架构&#xff09;技术通过将多台设备连接在一起&#xff0c;虚拟化成一台设备&#xff0c;集成多台设备的硬件资源和软件处理能…