首页 > 其他分享 >数组

数组

时间:2023-05-22 23:33:01浏览次数:29  
标签:10 arr int 元素 二维 数组

一、 一维数组的创建和初始化

1、数组的创建

数组书写的格式:

数组类型       数组名[常量表达式];

如:

int arr[10];//创建一个数组,数组有10个元素,元素类型是int型。

       char ch[5];// 创建一个数组,数组有5个元素,元素类型是char型。


2、数组的初始化

      以上述int arr[10]为例:int arr[10] = {1,2,3,4,5,6,7,8,9,10};

      只写一个int arr[10],是在内存中开辟一块可存放10个int型元素的空间,而初始化后是既开辟了空间又存放了这1-10的数字。

      在C99之前,数组的初始化必须使用常量,不能使用变量,如:

数组_数组

这样写错的,不能使用变量来定义数组元素个数,但是C99之后支持了变长数组后就支持了,但是还是得看编译器是否支持C99标准。

      数组的初始化可以省略元素个数,但是前提是{}内得有初始化的元素,如:int arr[] = {1,2,3,4,5};这样可以。但如果int arr[] = {};这样是绝对不行的。

      数组也可以存放字符串,如:int arr[10] = “abcdfg”;[]内的常量也可以省略。


二、  一维数组的使用

使用数组元素需要借助一个操作符:[],这个叫下标引用操作符。如:输出数组中所有的元素。

数组_数组_02

      注:数组下标是从0开始的。最后一个数组的下标是数组元素个数-1。数组元素个数的求法是:int sz = sizeof(arr)/siaeof(arr[0]);

特别注意:数组名一般情况下代表首元素的地址,但是有两个特殊情况:

 (1)sizeof(数组名)这时的数组名代表的是整个数组。sizeof求出的是整个数组的大小。

       (2)&(数组名)这时的数组名代表的也是整个数组,取地址,取出的是整个数组的地址。

所以sz就是利用sizeof求出整个数组的大小除去数组第一个元素的大小得出的就是数组元素的个数。


三、  一维数组在内存中的存储

数组在内存中是连续存储的,代码如下:

数组_数组_03

输出结果:

数组_数组_04

这里取出的是数组元素在内存中存放的地址,地址在内存中是按16进制存放的。这里可以看到,因为数组中元素的类型是int型,int型占4个字节。所以可以看到每两个元素之间的地址正好差4。所以我们得出数组在内存中是连续存储的,而且随着数组元素的增长,地址也是逐渐增长的。

数组_数组_05


四、 二维数组的创建和初始化

1、  二位数组的创建

与一维数组一样,也是要有数组类型、数组名和[]中的常量表达式。但是二维数组是有两个[][]的,因为在逻辑上,二维数组代表的是几行几列的。

就如:int arr[2][3];创建一个两行三列的数组。

数组_数组_06

2、 二维数组的初始化

如:int arr[3][4] = {0};

       int arr[3][4] = {{0}, {0},{0}};

       int arr[][3] = {{1,2,3},{4,5,6}};二维数组初始化的时候,行可以省略,但是列不能省略。因为这个{}中只有两个小括号,说明这个二维数组中有两行,每行有4个元素。

数组_数组_07

图片中可以看到,这个二维数组有两行,每行被初始化成我们规定的元素。


五、  二维数组的使用

与一维数组同理,都可以使用数组下标引用元素和循环把数组元素挨个输出。

数组_数组_08

数组_数组_09

因为,它是一个二维数组所以要用两层循环来循环输出。



六、二维数组在内存中的存储

二维数组在内存中是如何存储的呢?也是连续存储的嘛?我们用代码验证一下,代码如下:

数组_数组_10

我们发现二维数组的地址居然也是连续的。那为什么我们要把它想象成分层的呢?因为这是为了我们大家更简单的了解二维数组。但是实际上二维数组在内存中存储方式为:

数组_数组_11

每一大块代表一个一行,一行内又分有好几个元素,代表一列的元素。



七、  数组作为函数参数

将数组作为参数传递给函数,例如设计一个冒泡排序需要用函数写,代码如下:

#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
	int i = 0;//10个元素一共需要走9趟
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;//每趟中要排序元素的个数
		for (j = 0; j < sz - 1 - i; j++)
		{
			int tmp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tmp;
		}
	}
}

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

输出结果如下:

数组_数组_12

解释:

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了,而通过这个数组首元素和数组元素个数可以推算出整个数组。所以在bubble_sort函数中操作的是这个arr数组。

第一步,初始化数组arr和计算数组元素个数sz,将数组名(数组首元素的地址)和数组元素传递给函数bubble_sort。

第二步,

数组_数组_13

这是第一趟,把9交换到了最后一位,第二趟的时候,就是把8交换到9的前面一位,9交换了9次,因为一共10个元素,把前9个元素的位置交换完成后,最后一个元素就会出现在它该出现的位置了。所以当第二趟交换8的时候,就只需要交换8次。

数组_数组_14

往后依次这样做,最后就会让整个数组按照0123456789这样排列。


标签:10,arr,int,元素,二维,数组
From: https://blog.51cto.com/u_15865089/6327774

相关文章

  • 【linux进阶】shell之数组字典参数处理详解
    在Shell脚本中,使用数组和字典(关联数组)可以方便地处理参数。以下是它们的介绍:数组Shell中的数组类似于其他编程语言中的数组,它是一个用于存储多个值的变量。在Bash和其他类Unixshell中,可以使用以下语法来创建和操作数组:1.定义数组定义数组需要使用array_name=(value1......
  • 轮转数组
    轮转数组简介题解方法一:我们可以使用额外的数组来将每个元素放至正确的位置。用\(n\)表示数组的长度,我们遍历原数组,将原数组下标为\(i\)的元素放至新数组下标为\((i+k) mod n\)的位置,最后将新数组拷贝至原数组即可。classSolution{public:voidrotate(vec......
  • 指向对象数组的对象指针
    #include<iostream>usingnamespacestd;classstudent{public:student(intn,floats):num(n),score(s){}voiddisplay(void);private:intnum;floatscore;};voidstudent::display(void){cout<<num<<":"......
  • 数组排序输出(函数模板)
    对于输入的每一批数,按从小到大排序后输出。一行输入为一批数,第一个输入为数据类型(1表示整数,2表示字符型数,3表示有一位小数的浮点数,4表示字符串,0表示输入结束),第二个输入为该批数的数量size(0<size<=10),接下来为size个指定类型的数据。输出将从小到大顺序输出数据。函数接口定义:sor......
  • 找到数组中第几个最小的数据
    找到数组中第几个最小的数据将经典的快速排序算法做简单修改即可示例代码如下:voidtestFindSpecificMin(){intarr[]={2,4,3,9,6,5,7,0,2,1};//intarr[]={4,2,9};//intarr[]={0,1,2,3,4,5,6,7,8};intposition=2;findSpe......
  • 树状数组学习笔记
    树状数组(BinaryIndexedTree)是一种利用数的二进制特征进行检索的树状结构。树状数组是一种奇妙的数据结构,不仅非常高效,而且代码及其简洁。 #definelowbit(x)((x)&-(x))voidadd(intx,intd){//更新while(x<=n){tree[x]+=d;x+=lowbit(x);}}......
  • 【iOS开发】for in 可变数组 崩溃
    该问题来自一道笔试题:一、执行下面代码会发生什么?什么解决?NSMutableArray*array=[NSMutableArrayarrayWithObjects:@"122",@"333",@"444",nil];for(NSString*stringinarray){[arrayremoveObject:string];}答:会崩溃,提示NSGenericExc......
  • 【React工作记录五十九】根据key值过滤形成新得数组
     目录前言导语 核心实现代码运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语根据key......
  • Python 什么是数组?
    在Python中,数组通常是指用于表示具有相同数据类型的多个元素的数据结构。在Python中,数组可以表示为列表或NumPy数组。列表:Python中最常用的数组表示法是“列表”。一个列表是由一系列有序元素的集合组成,每个元素可以是字符串、数字、布尔值和其他任何类型的对象。例如: ......
  • 【算法题】二维数组打印
    链接:https://www.nowcoder.com/questionTerminal/6fadc1dac83a443c9434f350a5803b51有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印。(注:主对角线方向为从左上角指向右下角这一斜线的方向)给定一个二位数组arr及题目中的参数n,请返回结果数组。 数......