IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言 -- 数组 -> 正文阅读

[C++知识库]C语言 -- 数组

一维数组的创建和初始化

一维数组的创建

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

例如:

#include<stdio.h>

void main()
{
	//元素类型 数组名[常量表达式指定数组的大小]
	int arr1[10];
	char arr2[10];
	float arr3[30];
	double arr4[20];
}

关于动态开辟:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main()
{
	int n;
	printf("请输入想要开辟数组空间的大小:\n");
	scanf("%d", &n);

	//动态开辟 malloc--free
	int* arr = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++)
	{
		arr[i] = i + 1;
	}

	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}

	free(arr); //释放空间
}

一维数组的初始化

数组的初始化是指在创建数组的同时给你数组的内容一些合理的初始值
数组在创建的时候如果不只当数组确定的大小就需要初始化,数组元素的个数根据初始化的内容来确定

例如:

#include<stdio.h>

void main()
{
	//数组的初始化
	int arr1[10] = { 1,2,3 };
	int arr2[] = { 1,2,3,4 };

	char arr3[3] = { 'a',98,'c' };

	//对于以下几种方式请注意区分
	int n1, n2, n3;
	char arr4[] = { 'a','b','c' };
	n1 = sizeof(arr4) / sizeof(arr4[0]); //计算数组的大小

	char arr5[3] = { 'a','b','c' };
	n2 = sizeof(arr5) / sizeof(arr5[0]);

	char arr6[] = "abc"; //字符串,以\0结尾,有四个元素
	n3 = sizeof(arr6) / sizeof(arr6[0]);
	printf("%d,%d,%d", n1, n2, n3); //3,3,4
}

一维数组的使用

数组的元素时使用下标来访问的,下标从0开始
数组的大小可以通过计算得到

例如:

#include<stdio.h>

void main()
{
	int arr[10] = { 0 }; //数组的不完全初始化
	int n = sizeof(arr) / sizeof(arr[0]); //计算数组的大小

	//通过循环打印未完全初始化数组的各个元素
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
		//0 0 0 0 0 0 0 0 0 0
	}
	printf("\n");

	//对数组的内容进行赋值
	for (int i = 0; i < n; i++)
	{
		arr[i] = i + 1;
	}

	//通过循环打印赋值后数组的各个元素
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
		//1 2 3 4 5 6 7 8 9 10
	}
}

一维数组在内存中的存储

数组在内存中是连续存放的,这也是数组元素可以随机访问的原因

例如:

#include<stdio.h>

void main() 
{
	int arr[5] = { 0 };
	for (int i = 0; i < 5; i++)
	{
		arr[i] = i + 1;
	}

	//打印出数组中各个元素的地址
	for (int i = 0; i < 5; i++)
	{
		printf("arr[%d]的地址为:%p\n", i, &arr[i]);
	}

	    //arr[0]的地址为:000000252BF0F768
		//arr[1]的地址为:000000252BF0F76C
		//arr[2]的地址为:000000252BF0F770
		//arr[3]的地址为:000000252BF0F774
		//arr[4]的地址为:000000252BF0F778

	//观察输出结果可以看出随着下标的增加,元素的地址也在有规律的增长
	//数组在内存中是连续存放的
}

二维数组的创建和初始化

二维数组的创建

例如:

#include<stdio.h>

void main()
{
	int arr1[3][4]; //创建一个3行4列的整型数组
	char arr2[3][5]; //创建一个3行5列的字符型数组
	double arr3[4][5]; //创建一个4行5列的double型数组
}

二维数组的初始化

例如:

#include<stdio.h>

void main()
{
	int arr1[3][4] = { 1,2,3,4 };
	int arr2[3][4] = { {1,2},{3,4} };
	int arr3[][4] = { {1,2},{3,4} };
}

二维数组的使用

二维数组的使用也是通过下标的方式

例如:

#include<stdio.h>

void main()
{
	int arr[3][4] = {0}; //建立并初始化一个二维数组

	//给二维数组赋值
	for (int i = 0; i < 3; i++) //行数的便利
	{
		for (int j = 0; j < 4; j++) // 列数的循环
		{
			arr[i][j] = j+1;
		}
	}

	//打印数组每个元素的值
	for (int i = 0; i < 3; i++) //行数的便利
	{
		for (int j = 0; j < 4; j++) // 列数的循环
		{
			printf(" %d  ", arr[i][j]);
		}
		printf("第%d行打印完毕\n", i+1);
	}
}

二维数组在内存中的使用

数组在内存中是连续存放的

例如:

#include<stdio.h>

void main()
{
	int arr[3][4] = { 0 }; //建立并初始化一个二维数组

	//给二维数组赋值
	for (int i = 0; i < 3; i++) //行数的便利
	{
		for (int j = 0; j < 4; j++) // 列数的循环
		{
			arr[i][j] = j + 1;
		}
	}

	//打印数组每个元素的地址
	for (int i = 0; i < 3; i++) //行数的便利
	{
		for (int j = 0; j < 4; j++) // 列数的循环
		{
			printf(" %p\n", &arr[i][j]);
		}
	}
	    //000000450F0FFA38
	    //000000450F0FFA3C
		//000000450F0FFA40
		//000000450F0FFA44
		//000000450F0FFA48
		//000000450F0FFA4C
		//000000450F0FFA50
		//000000450F0FFA54
		//000000450F0FFA58
		//000000450F0FFA5C
		//000000450F0FFA60
		//000000450F0FFA64
		
	//观察输出结果可以看出随着下标的增加,元素的地址也在有规律的增长
	//数组在内存中是连续存放的
}

数组作为函数参数

在编写程序的时候,往往需要将数组作为参数传给函数
数组名在除以下两种情况外可以认为是数组首元素的地址:

sizeof(数组名),数组名表示整个数组:

#include<stdio.h>

void main()
{
	int arr[10] = { 0 };
	int n = sizeof(arr); //sizeof(数组名),数组名表示整个数组
	printf("%d\n", n); //40
}

&数组名,取出的是数组的地址,数组名表示整个数组;

#include<stdio.h>


void main()
{
	int arr[] = { 1,2,3,4,5 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr);
	//以上三条打印语句打印的虽然结果是一样的
	//但是,代表的含义却不一样,区别在使用指针会有表现
}

例如:

#include<stdio.h>

//想要完成冒泡排序的函数,假设只将数组作为函数的参数
void bubble_sort_try(int arr[]) //只是把数组首元素的地址传进去了, int arr[]表示的是一个指针
{
	int n = sizeof(arr) / sizeof(arr[0]); // sizeof(arr)只是首元素地址大小,所以n=1,在排序的时候只能排前两个元素
	printf("%d\n", sizeof(arr)); //1
	int tem;
	for (int i = 0; i < n-1 ;i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
	}
}


//正确做法
void bubble_sort(int arr[], int n)
{
	int tem;
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
	}
}

void main()
{
	int arr[] = { 22,45,943,8,83,2 };
	int n = sizeof(arr) / sizeof(arr[0]);
	//bubble_sort_try(arr); //运行可以发现程序无法实现排序
	//修改就是将元素个数也作为参数传入函数即可

	bubble_sort(arr, n);
	for (int i = 0; i < n ; i++)
	{
		printf("%d ", arr[i]);
	}
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:39:12  更:2021-11-16 18:39:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:57:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码