初阶C语言-数组

这篇具有很好参考价值的文章主要介绍了初阶C语言-数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

“少年没有偏旁,自己便是华章!” 今天我们继续一起来学习一下数组的相关知识点。

1.一维数组的创建和初始化

什么是数组呢? 数组是一组相同类型元素的集合。

1.1 数组的创建

//数组的创建
//type_t arr_name [const_n]
//type_t 是数组的元素类型
//arr_name是数组名
//const_n是一个常量表达式,用来指定数组的大小
//数组创建的示例:
//C99之前数组只能是常量指定大小,C99之后引用了变长数组的概念,数组的大小可以使用变量指定的
//但是VS2019不支持C99的变长数组的
#include <stdio.h>
int main()
{
	int arr1[10];
	int arr2[3 + 2];
	char arr3[8];
	return 0;
}

1.2 数组的初始化

数组的初始化是指:在创建数组的同时给数组的内容一些合理初始值(初始化)。

#include <stdio.h>
int main()
{
	int arr1[10] = { 1,2,3 };//不完全初始化,剩余元素初始化为0
	int arr2[4] = { 1,2,3,4 };//完全初始化
	char arr3[] = { 'a','b','c' };//数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。
	char arr4[] = { 'a',98,'c' };
	char arr5[] = { "abcdefgh" };
	return 0;
}

初阶C语言-数组,c语言,开发语言
初阶C语言-数组,c语言,开发语言
初阶C语言-数组,c语言,开发语言
这里,我们要区分以下用字符给数组初始化和用字符串给数组初始化,通过监视,我们可以发现用字符串给数组初始化是有'\0'的。
初阶C语言-数组,c语言,开发语言
初阶C语言-数组,c语言,开发语言

1.3 一维数组的使用

对于数组的使用,我们之前介绍了一个操作符:[],下标引用操作符。它其实就是数组访问的操作符。

//一维数组的使用
#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//            0,1,2,3,4,5,6,7,8,9
	//注意:数组的下标是从0开始的
	printf("%d\n", arr[6]);//相应的下标就会对应相应的数组元素
	return 0;
}

初阶C语言-数组,c语言,开发语言
那如果我们想打印出数组的全部元素应该怎么做呢?难道要使用10个printf语句吗?这里,显然是不可能的,这个时候,我们就要想到使用for循环来解决问题。

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//            0,1,2,3,4,5,6,7,8,9
	int sz=sizeof(arr)/sizeof(arr[0])-1;
	int i = 0;//做下标
	for (i = 0; i <= sz; i++)//数组的元素是通过下标来访问的
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

初阶C语言-数组,c语言,开发语言

刚刚我们只是用下标来打印数组的元素,如果我们想把数组的元素的值改掉,应该怎么做呢?
比如我们现在要把数组元素改为10 9 8 7 6 5 4 3 2 1,应该怎么改代码呢?

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//            0,1,2,3,4,5,6,7,8,9
	int sz = sizeof(arr) / sizeof(arr[0])-1;
	int i = 0;
	for (i = 0; i <= sz; i++)
	{
		arr[i] = 10 - i;
		printf("%d ", arr[i]);
	}
	return 0;
}

初阶C语言-数组,c语言,开发语言

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

想要知道数组在内存中的存储,打印出它们的地址就能很好的观察了。

#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;
}

初阶C语言-数组,c语言,开发语言
注:通过仔细观察,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增,因此,数组在内存中是连续存放的。
因此,我们只要知道了数组的首地址,通过遍历,就能访问数组的全部元素了。
初阶C语言-数组,c语言,开发语言

2. 二维数组的创建和初始化

2.1二维数组的创建

char arr1[3][5]//第一个表示行第二个表示列
int arr2[3][5]int arr3[2][3]

2.2二维数组的初始化

//二维数组的初始化
#include <stdio.h>
int main()
{
	char arr1[3][5] = { 0 };
	int arr2[3][5] = { {1,2,3,4,5},{6,7,8,9, 8},{1,2,3,4,5}};
	int arr3[2][3] = { {1,2},{3,4} };
	int arr4[][4] = { {1,2},{1,2,3,4} };//二维数组如果有初始化,行可以省略,列不能省略
	return 0;
}

初阶C语言-数组,c语言,开发语言

2.3二维数组的使用

二维数组的使用也是通过下标的访问。

int arr2[3][5] = { {1,2,3,4,5},{6,7,8,9, 8},{1,2,3,4,5}};

对于这样的一个二维数组,我们假想中它的排列是这样的:
初阶C语言-数组,c语言,开发语言
那么我们可以看到,通过对应的行号和列号的下标就能访问到对应的元素了。那么,如果我们想打印出二维数组的全部元素,应该怎么做呢?

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

初阶C语言-数组,c语言,开发语言

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

像一维数组一样,我们可以尝试打印二维数组每个元素的地址。

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

初阶C语言-数组,c语言,开发语言
注:通过仔细观察,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增,因此,二维数组在内存中是连续存放的。

因此,二维数组在内存中的存储应该是这样的:也可以将二维数组理解为一维数组的数组。如下图所示的a[0]a[1]可以理解为二维数组拆分成的两个一维数组名。
初阶C语言-数组,c语言,开发语言

3.数组越界

数组的下标是有范围限制的,数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1.所以数组的下标如果小于0,或者大于n-1,就是数组越界访问,超出了数组合法空间的访问。C语言本身是不做数组下标的越界检查,编译器也不一定为报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码的时候,最好自己做越界检查。

#include <stdio.h>
int main()
{
	int arr[2][3] = { {1},{2,3} };
	int i = 0;
	for (i = 0; i < 2; i++)
	{
		int j = 0;
		for (j = 0; j <= 3; j++)//我们发现这里列存在越界行为,但是编译器并没有报错
		{
			printf("arr[%d][%d] = %d\n", i, j, arr[i][j]);
		}
	}
	return 0;
}

初阶C语言-数组,c语言,开发语言
正确的写法是什么样的呢?

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

初阶C语言-数组,c语言,开发语言
注:二维数组的行和列也可能存在越界。

4.数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传个函数。比如:我要实现一个冒泡排序。

冒泡排序的思想:两两相邻的元素进行比较。
假设我们这里现在有10 9 8 7 6 5 4 3 2 1这十个数,如果我们希望通过冒泡排序实现升序应该怎么做呢?
初阶C语言-数组,c语言,开发语言
不难发现,想要排十个数,我们最多要冒泡九次,那么我们一起来用代码演示一下这个过程吧!

//冒泡排序
#include <stdio.h>
int main()
{
	int arr1[] = { 10,9,8,7,6,5,4,3,2,1 };
	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j <sz-i-1 ; j++)
		{
			if(arr1[j]>arr1[j+1])
			{
				int t = arr1[j];
				arr1[j] = arr1[j + 1];
				arr1[j + 1] = t;
			}
		}
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

初阶C语言-数组,c语言,开发语言
前面我们也学习了函数,这里我们能不能设计一个冒泡排序的函数呢?

#include <stdio.h>
void bubble_sort(int arr[])
{
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
}
int main()
{
	int arr1[] = { 10,9,8,7,6,5,4,3,2,1 };
	bubble_sort(arr1);
	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

可能我们一开始想到的代码是这样的,那么这样写对不对呢?
初阶C语言-数组,c语言,开发语言
我们发现,这并没有帮我们实现升序的功能!那么,到底是哪里出现问题了呢?
初阶C语言-数组,c语言,开发语言
通过调试,我们发现在冒泡函数里求数组元素个数sz方面出现了问题,这到底是为什么呢?这就是涉及到用数组作为函数的参数,到底传的是什么呢?传的是整个数组吗?这里,我们就需要来认识一下数组名!

4.2数组名是什么?

通常来说,数组名是数组首元素的地址。

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

初阶C语言-数组,c语言,开发语言

注:通常的说,数组名就是数组的首地址。但是,存在两个例外:
1.sizeof(数组名),这里的数组名就表示整个数组,计算的是整个数组的大小,单位是字节。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
除此之外,所有遇到的数组名都是数组的首地址。</font

同样,对上面的知识有所了解之后,我们就可以发现刚刚冒泡排序出问题的地方:

//数组名作为函数参数(错误)
#include <stdio.h>
//应该使用指针来接收
void bubble_sort(int arr[])//本质是指针
{
	int i = 0;
	//数组名作为函数的参数传过去的是数组的首地址,没办法求数组元素个数。
	int sz = sizeof(arr) / sizeof(arr[0]);//4/4=1
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
}
int main()
{
	int arr1[] = { 10,9,8,7,6,5,4,3,2,1 };
	bubble_sort(arr1);//这里的arr1不是两种特殊的情况,就是数组首元素的地址
	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

4.3冒泡排序函数的正确设计

当数组传参的时候,实际上只是把数组的首元素的地址传过去了。所以即使在函数的参数部分写成数组的形式:int arr[]表示的依然是一个指针:int *arr.所以,这里我们考虑直接在主函数内部求出sz,在冒泡排序的函数内直接用就行。

//数组名作为函数参数(正确)
#include <stdio.h>
//void bubble_sort(int *arr,int sz)
void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
}

int main()
{
	int arr1[] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	bubble_sort(arr1,sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

初阶C语言-数组,c语言,开发语言
我们发现,这样就解决了刚刚的问题啦!

好啦,关于数组的知识点到这里就结束啦,后期会继续更新C语言相关知识点,欢迎大家持续点赞、关注和评论!大家多多支持团子呀!文章来源地址https://www.toymoban.com/news/detail-623139.html

到了这里,关于初阶C语言-数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言初阶】指针数组or数组指针!又被这些命名搞蒙了?

    🎬 鸽芷咕 : 个人主页  🔥 个人专栏 : 《C语言进阶篇》 《C语言初阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面我们已经把指针大部分内容给学完了,今天就给大家带来数组指针or指针数组!    ⛳️ 很多说这俩名字不是差不

    2024年02月16日
    浏览(37)
  • 【C语言初阶】指针的运算or数组与指针的关系你了解吗?

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《快速入门C语言》《C语言初阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面给大大家介绍了指针的基础知识。那么这一章就来给大家介绍下一部分内容!    ⛳️ 指针的运算 以及 数组与指

    2024年02月16日
    浏览(34)
  • 【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,今天继续给大家更新0基础入门C语言的内容,我们这次主要更新的依然是初阶指针的基础知识 废话不多说咱们直接开始吧!! 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有

    2024年02月16日
    浏览(45)
  • 初阶算法(3):二分法的讲解与实现(C语言),以及二分不止光在有序数组中的应用

     第一章 初阶算法(1):通过简单的排序算法来认识时间复杂度  第二章 初阶算法(2):进行详细地介绍插入排序的细节和时间复杂度  第三章 初阶算法(3):二分法的讲解与实现,以及二分不止光在有序数组中的应用 目录 系列文章目录 前言 一、二分法的讲解与实现

    2024年02月14日
    浏览(43)
  • C初阶--指针初阶(下):指针运算+指针和数组+二级指针+指针数组

    目录 一.指针运算🌴 1.曾经用过的案例:写一个模拟实现字符串的函数 2.指针+-整数🌾  3.指针-指针🌏 方法1:大地址-小地址或者小地址-大地址⛅ 方法2:模拟实现指针相减🌱 4.指针的关系运算 二.指针和数组 ☑️☑️​​​​​​​☑️​​​​​​​重点:  💾画图笔记

    2023年04月12日
    浏览(32)
  • 【Python爬虫与数据分析】NumPy初阶——数组创建与访问

    目录 一、NumPy概述 二、NumPy数据类型 三、创建数组 1. numpy.array函数创建数组 2. np.arange创建数组 3. numpy.random.rand创建数组 4. numpy.random.randint创建数组 5. NumPy创建特殊数组 四、数组的属性 五、NumPy数组索引与切片 NumPy(Numerical Python的简称)是一个开源的Python科学计算库,用于对

    2024年02月13日
    浏览(51)
  • 【C语言初阶(八)】初阶指针详解

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 我们在介绍C语言时已经给大家介绍过指针的概念以及内存地址的概念了,这里我们就不再重复说明前面的内容,对指针毫无了解的

    2024年02月09日
    浏览(45)
  • 【初阶C语言】初阶结构体详细讲解

    结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 例如描述一个学生: 结构的成员可以是标量、数组、指针,甚至是其他结构体。 有了结构体类型,那如何定义变量,其实很简单。 结构体变量访问成员 结构变量的成员是通过点操作符(

    2023年04月12日
    浏览(36)
  • 初阶C语言(一)-初识C语言

    抱歉啦,发完第一篇之后断更这么久,主要是因为发完上一篇之后,就进入了期末周,一直在复习,就没有找到合适的时间来更新,现在也放假啦,暑假让我们一起努力学习吧!按照我的规划,会从C语言开始学起,主要以更新学习笔记为主,有任何不对的地方,欢迎大家批评

    2024年02月16日
    浏览(34)
  • C语言完整版笔记(初阶,进阶,深刨,初阶数据结构)

    1.初阶: 1.1C语言初阶易忘知识点速记 2.进阶:  1.2C语言进阶易忘点速记 3.深剖: 2.1C语言重点解剖要点速记 2.2C语言重点解剖操作符要点速记   2.3C语言重点解剖预处理要点速记 2.4C语言重点解剖指针和数组要点速记 2.5C语言重点解剖内存管理函数要点速记 4.数据结构:

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包