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.mzph.cn/news/199390.shtml

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

相关文章

华为 ArkTS 边框怎么设置,单边边框怎么设置以及条件设置边框(鸿蒙开发)

一、实例代码&#xff1a; border(params) 接收一个对象参数&#xff0c;对象参数的属性为width?: Lenght&#xff0c;color?: &#xff0c;radius?: Length,style?: BorderStyle 注意&#xff1a;以下实例包含了我说知道的 边框的单位 以及 颜色 的各种用法 Column() {Im…

【已解决】MySQL:执行存储过程报错(MySQL字符集和排序方式冲突)

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、转换条件两边的字段或值为二进制数据&#xff1a; 2、转换条件两边的字段或值的字符集和排序方式&#xff1a; 3、修改列、表、库的字符集和排序方式 参考链接&#xff1a; 问…

微信商城小程序怎么制作?做一个小程序需要什么流程?

小程序商城对商家有哪方面的帮助&#xff1f; 随着移动互联网的快速发展&#xff0c;小程序商城已经成为了越来越多商家的选择。那么&#xff0c;小程序商城到底对商家有哪些方面的帮助呢&#xff1f; 一、提高商家曝光度 在小程序平台上开设自己的小程序商城&#xff0c;可以…

AI之火是如何燎原的?始于马斯克与佩奇的一场激辩

丨划重点 ①在2015年, 马斯克44岁生日派对上&#xff0c;他与谷歌联合创始人佩奇曾就AI产生严重分歧&#xff0c;甚至终结了十多年的友谊。佩奇认为人类最终将与AI机器融合&#xff0c;将会有许多种智能争夺资源, 马斯克则担心机器可能会毁灭人类。 ②在收购AI创企DeepMind时…

acwing1209.带分数暴力与优化(java版)

//n a b / c n是确定的,只需找到其中两个。判断剩下一个数是否满足条件即可 //由题目条件可知,每个数不能重复使用,需要一个st全局数组判断每个数是否使用过 //递归实现排列型枚举,cn ac b //对于枚举出来的每一个a,再去枚举每一个c,再在c的枚举里判断b是否满足条件 //…

人工智能学习3(特征变换:特征数值化)

编译工具&#xff1a;PyCharm 有些编译工具不用写print可以直接将数据打印出来&#xff0c;pycharm需要写print才会打印出来。 文章目录 编译工具&#xff1a;PyCharm 概念1.特征类型分类型二值型顺序型数值型 2.特征数值化练习13.特征数值化练习24.特征二值化使用sklearn库自…

day69

今日回顾 Django与Ajax 一、什么是Ajax AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML,现在…

YOLOv8优化策略:简单高效的模块-现代反向残差移动模块 (iRMB) | | ICCV2023 EMO

🚀🚀🚀本文改进:设计了一种面向移动端应用的简单而高效的现代反向残差移动模块 (Inverted Residual Mobile Block, iRMB),它吸收了类似 CNN 的效率来模拟短距离依赖和类似 Transformer 的动态建模能力来学习长距离交互,引入YOLOV8 🚀🚀🚀YOLOv8改进专栏:http:…

三个角度(握手、挥手、传输)优化TCP

TCP 三次握手的性能提升 客户端的优化 当客户端发起 SYN 包时&#xff0c;可以通过 tcp_syn_retries 控制其重传的次数。 服务端的优化 当服务端 SYN 半连接队列溢出后&#xff0c;会导致后续连接被丢弃&#xff0c;可以通过 netstat -s 观察半连接队列溢出的情况&#xff0c;如…

对标Gen-2!Meta发布新模型进军文生视频赛道

随着扩散模型的飞速发展&#xff0c;诞生了Midjourney、DALLE 3、Stable Difusion等一大批出色的文生图模型。但在文生视频领域却进步缓慢&#xff0c;因为文生视频多数采用逐帧生成的方式,这类自回归方法运算效率低下、成本高。 即便使用先生成关键帧,再生成中间帧新方法。如…

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt&#xff08;重要&#xff09;4、…

Python语言基础学习大纲(由某大模型生成)

自从上次经丙察察游了一次滇藏线&#xff0c;已有3个没写一篇了。今天利用由某大模型生成的上面这张思维导图&#xff0c;配合这个大模型生成的6000多字拼凑出一篇博文聊以交差。 Python语言概述 一、语言特点 1.语法简单明了 Python的语法简洁易懂&#xff0c;使得编写代码…

12.5作业

1. #include <iostream>using namespace std;class Animal { private:string name; public:Animal(){}Animal(string name):name(name){cout << "animal" << endl;}virtual void perfrom(){cout << "实现不同表演行为" << …

Windows下安装Git和Git小乌龟

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。Git支持将本地仓库与远程仓库进行关联&#xff0c;实现多人协作开发。由于具有分布式版本控制、高效性、灵…

C++12.5

想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&#xff0c;他会为每种动物表演做简单的介绍。 在这个场景中&#xff0c;我们可以将动物比作是不同的类&#xff0c;而每种动物表演则…

【数据结构】链表OJ题(顺序表)(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

握这些员工管理技巧,助你打造高效团队!

人力资源是一个组织中至关重要的一环&#xff0c;而员工管理是确保团队高效运转的关键因素之一。一个优秀的经理需要具备多方面的技巧和能力&#xff0c;以便激发员工的潜力&#xff0c;促进合作和增加团队的效率。在这里&#xff0c;我将分享一些实用的员工管理技巧&#xff0…

Hadoop学习笔记(HDP)-Part.12 安装HDFS

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

RAR文件的密码保护如何设置和取消?

RAR文件是压缩包一种常用的压缩文件格式&#xff0c;对于这种文件&#xff0c;我们如何设置和取消密码保护呢&#xff1f; 首先我们要下载适用于RAR文件的WinRAR解压缩软件&#xff0c;然后在压缩文件的时候&#xff0c;就可以同步设置密码&#xff0c;选中需要压缩的文件&…

在外包公司干测试半年,提升的只有我的年龄···

有一说一&#xff0c;外包没有给很高的薪资&#xff0c;是真不能干呀&#xff01; 先说一下自己的情况&#xff0c;本科生&#xff0c;年初通过校招进入深圳某软件公司&#xff0c;干了接近半年的功能测试&#xff0c;直到最近遇到了瓶颈&#xff0c;感觉自己不能够在这样下去了…