C语言学习笔记之数组篇

news2024/11/28 10:47:17

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

目录

一维数组

数组的创建

数组的初始化

数组的使用

数组在内存中的存储

二维数组

数组的创建

数组的初始化

数组的使用

数组在内存中的存储

数组名

数组名作函数参数


一维数组

数组的创建

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], 每个数组元素的类型:int

	int 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.coloradmin.cn/o/1286579.html

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

相关文章

2023年12月5日作业:多态

题目&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Animals { private:string name; public:Animals(){}Animals(string name):name(name){}virtual void perform() 0;void show(){cout << "这个动物是" << name…

周周爱学习之快速排序

快速排序&#xff0c;顾名思义&#xff0c;快速排序是一种速度非常快的一种排序算法 平均时间复杂度为O(),最坏时间复杂度为O()数据量较大时&#xff0c;优势非常明显属于不稳定排序 1.算法描述 每一轮排序选择一个基准点&#xff08;pivot&#xff09;进行分区 让小于基准点…

ROW_NUMBER()函数——(分组后取每组最新的两条数据)

ROW_NUMBER() 功能&#xff1a;简单的说row_number()从1开始&#xff0c;为每一条分组记录返回一个数字。 用法一&#xff1a; ROW_NUMBER() OVER (ORDER BY col DESC) 说明&#xff1a;先把col列降序&#xff0c;再为降序后的每条col记录返回一个序号 用法二&#xf…

MybatisPlus概述

MybatisPlus概述 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑损耗小&#xff1a;启动即会自动注入基本 CURD&#xff0c;性能基本无损耗&#xff0c;直接面向对象操作强大的 CRUD 操作&#xff1a;内置通用 Mapper、通…

房产中介管理信息系统的设计与实现

摘 要 随着房地产业的开发&#xff0c;房产中介行业也随之发展起来&#xff0c;由于房改政策的出台&#xff0c;购房、售房、租房的居民越来越多&#xff0c;这对房产中介部门无疑是一个发展的契机。本文结合目前中国城市房产管理的实际情况和现阶段房屋产业的供求关系对房产中…

MYSQL8用户权限配置详解

单位的系统性能问题需要把Mysql5升级到Mysql8&#xff0c;需要用到Mysql8的一些特性来提升系统的性能。 配置用户权限过程中发现一些问题&#xff0c;学习并记录一下。 目录 一、环境 二、MySQL8 用户权限 2.1 账号管理权限 2.1.1 连接数据库 2.1.2 账号权限配置 2.2 密码…

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(十二)

多表查询 之前学过在需要同时查询多个表时使用 JOIN 进行表关联&#xff0c;但其实还有一种方法&#xff0c;使用 WHERE 关键字进行表的关联。 WHERE 有等值与非等值连接。 语法&#xff1a; SELECT 列名 ... FROM 表名 WHERE [表名.]<列名1><比较运算符>[表名.…

TsuKing: Coordinating DNS Resolvers and Queries into Potent DoS Amplifiers

目录 笔记后续的研究方向摘要引言之前的工作。我们的研究贡献 TsuKing: Coordinating DNS Resolvers and Queries into Potent DoS Amplifiers CCS 2023 笔记 本文介绍了一种名为 TsuKing 的新型 DNS 放大攻击。与以前利用单个DNS解析器的攻击不同&#xff0c;TsuKing协调多个…

接口自动化测试过程中怎么处理接口依赖?

面试的时候经常会被问到在接口自动化测试过程中怎么处理接口依赖&#xff1f; 首先我们要搞清楚什么是接口依赖。 01. 什么是接口依赖 接口依赖指的是&#xff0c;在接口测试的过程中一个接口的测试经常需要依赖另一个或多个接口成功请求后的返回数据。 那怎么处理呢&#x…

【软件测试】技术精选:Jmeter常见的几种报错

1、Java.net.UnknownHostException 这个错的含义是 没有连接到服务器地址&#xff0c;因此很可能是 内部网络中断导致。 2、502 Bad gateway 这个和本地的线程数无关 可能原因是网络抖动不稳定导致 3、java.net.SocketException: Socket closed 强制停止线程&#xff0c;连接…

旋转设备状态监测与预测性维护:提高设备可靠性的关键

在工业领域的各个行业中&#xff0c;旋转设备都扮演着重要的角色。为了确保设备的可靠运行和预防潜在的故障&#xff0c;旋转设备状态监测及预测性维护变得至关重要。本文将介绍一些常见的旋转设备状态监测方法&#xff0c;并探讨如何利用这些方法来实施预测性维护&#xff0c;…

Android基础: 使用Java代码控制 Activity类页面相互之间进行跳转 Activity页面的的启动和结束

Android基础&#xff08;Activity&#xff09; Activity的启动和结束 我们主要看Java代码逻辑&#xff1a; 第一个页面的逻辑代码 public class StartActivity01 extends AppCompatActivity implements View.OnClickListener {Overrideprotected void onCreate(Bundle saved…

temu最近数据:拼多多旗下跨境电商平台的业绩持续增长

据最近的报道和数据显示&#xff0c;拼多多旗下的跨境电商平台Temu在2023年第三季度取得了显著的业绩增长。销售额突破50亿美元&#xff0c;市场份额不断扩大&#xff0c;用户数量迅速增长。本文将深入探讨Temu的业绩增长、市场份额、用户增长以及其营销策略。 先给大家推荐一款…

C语言给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)

这个题目要求的输出是一串数字&#xff01;&#xff01;&#xff01; 不是下面&#xff1a;输入在一行中给出 10 个非负整数&#xff0c;顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50&#xff0c;且至少拥有 1 个非…

伯俊软件CTO陈雨陆:R3全渠道业务中台的OceanBase落地实践

11 月 16 日&#xff0c;OceanBase 在京顺利举办 2023 年度发布会&#xff0c;正式宣布&#xff1a;将持续践行“一体化”产品战略&#xff0c;为关键业务负载打造一体化数据库。其中&#xff0c;“数字化转型升级实践专场”我们有幸邀请到伯俊软件 CTO 陈雨陆进行《OceanBase …

洗地机哪个牌子好用?洗地机希亦、石头、添可、西屋谁的清洁力更强?

洗地机的出现极大地改善了清洁过程&#xff0c;提高了效率&#xff0c;减少了人力投入。但随着市场上洗地机的种类和功能不断增加&#xff0c;人们可能会感到困惑&#xff0c;不知道如何选择适合自己需求的机器。为了帮助消费者更好地了解洗地机的选择&#xff0c;今天我将带大…

Redlock算法实现Redis分布式锁

Redlock算法实现Redis分布式锁 为什么基于故障转移的实现还不够 使用 Redis 锁定资源的最简单方法是在实例中创建密钥。密钥通常是在有限的生存时间内创建的&#xff0c;使用 Redis 过期功能&#xff0c;以便最终它被释放&#xff08;我们列表中的属性 2&#xff09;。当客户…

老师需要具备的能力

作为一名老师&#xff0c;需要具备许多能力&#xff0c;来有效地教授学生知识和技能。本文将从以下几个方面探讨老师所需具备的能力。 一、教学能力 教学是老师工作的核心&#xff0c;因此老师需要具备高超的教学能力。这包括了开展教学计划、教学设计、授课技巧和引导学生思考…

数据分享 I 各类制造业企业进入数量数据,shp/excel格式数据,覆盖2002-2019年数据,已可视化处理

随着经济的发展和社会的进步&#xff0c;制造业作为国民经济的重要支柱&#xff0c;一直保持着快速的发展态势。近年来&#xff0c;随着国家对制造业的大力扶持&#xff0c;各类制造业企业如雨后春笋般涌现出来&#xff0c;为经济的发展注入了新的活力。 各类制造业企业进入…

CAD画图-模型和布局区别,视图命令MV使用(用于局部放大显示)

模型和布局的图像区别 模型的图像&#xff1a; 是我们常编辑的cad文件&#xff0c;我们可以对里面内容进行编辑和测量等操作 布局的图像&#xff1a;为了可以更好的看到每个部件的相对位置&#xff0c;但对于里面的点位的标注就不行了&#xff0c;但可以对图像中的某些部位进行…