C言語入門-「一次元から多次元の配列」

序文

配列(配列)は、処理を容易にするために、組織化された順序の同じ種類の形式で複数の要素を形成するための要素の順序付けられたシーケンスです。同様のデータ要素のこれらの順序付けられたコレクションは、配列と呼ばれます

一次元配列

1.1次元配列の作成

1.1スタック領域に作成

//方式一:显式声明法
int array[4]={
    
    1,2,3,4};//声明并定义一个含有4个整型元素的整型数组
//方式二:隐式声明法
int array[]={
    
    1,2,3,4};//同上

1.2ヒープ領域で作成

//在堆区开辟一个含有4个整型内存空间,并用一个整型指针指向该空间
int *array=(int *)malloc(sizeof(int)*4);

2.1次元配列の使用

2.1配列表記

2.1.1配列要素の取得

int array[4]={
    
    1,2,3,4};
//采用下标索引
printf("array[0]=%d\n",array[0]);
printf("array[1]=%d\n",array[1]);
printf("array[2]=%d\n",array[2]);
printf("array[3]=%d\n",array[3]);
//采用遍历的方式
for(int i=0;i<4;i++)
{
    
    
	printf("array[%d]=%d\n",i,array[i]);
}

2.1.2配列関数のパス値

void print_array(int array[4])
{
    
    
	for(int i=0;i<4;i++)
	{
    
    
		printf("array[%d]=%d\n",i,array[i]);
	}
}
int main()
{
    
    
	int array[4]={
    
    1,2,3,4};
	print_array(array);
	return 0;
}

2.2ポインタ表記

2.2.1配列要素の取得

int array[4]={
    
    1,2,3,4};
printf("a[0]=%d\n",*(array+0));//在编译过程中*(array+0)将转换成*(array+0*sizeof(int))
printf("a[0]=%d\n",*(array+1));//在编译过程中*(array+0)将转换成*(array+1*sizeof(int))
printf("a[0]=%d\n",*(array+2));//在编译过程中*(array+0)将转换成*(array+2*sizeof(int))
printf("a[0]=%d\n",*(array+3));//在编译过程中*(array+0)将转换成*(array+3*sizeof(int))
//遍历
for(int i=0;i<4;i++)
{
    
    
	printf("a[%d]=%d\n",i,*(array+i));
}

2.2.2配列関数のパス値

void print_array(int *array)
{
    
    
	for(int i=0;i<4;i++)
	{
    
    
		printf("a[%d]=%d\n",i,array[i]);
	}
}
int main()
{
    
    
	int array[4]={
    
    1,2,3,4};
	print_array(array);
	return 0;
}

3.メモリ上の1次元配列のマッピング

ここに写真の説明を挿入
コード検証は次のとおりです

	int array[4]={
    
    1,2,3,4};
	printf("array[0]的地址为:%p\n",&array[0]);
	printf("array[1]的地址为:%p\n",&array[1]);
	printf("array[2]的地址为:%p\n",&array[2]);
	printf("array[3]的地址为:%p\n",&array[3]);
	

VC6.0の実行結果は次のとおりです

ここに写真の説明を挿入

2つの多次元配列

对于一维数组,我们可以这样理解,一个小号水果篮子里面放着n个水果,而多维
数组,以二维数组为例,可以理解为——n个小号水果篮子,每个水果篮子里面放着n
个水果,而以三维数组为例,可以理解为——n个中号水果篮子,每个中号水果篮
子里面放着n个小号水果篮子,而每个小号水果篮子里面又放着n个水果...可以这么
说,n维数组套n层娃(俄罗斯套娃哈哈哈)

1.多次元配列の作成

1.1スタック領域に作成

int array[2][2]={
    
    {
    
    1,2},{
    
    3,4}};//创建一个二维数组
int array[2][2][2]={
    
    {
    
    {
    
    1,2},{
    
    3,4}},		//创建一个三维数组
					{
    
    {
    
    5,6},{
    
    7,8}}
				   };

ヒープ領域で作成

//以二维数组为例
int **array=(int **)malloc(2*sizeof(int *));
for(int i=0;i<2;i++)
{
    
    
	array[i]=(int *)malloc(2*sizeof(int));
}

2.多次元配列の使用

2.1配列表記

2.1.1配列要素の取得

//以二维数组为例
//采用下标索引
int array[2][2]={
    
    {
    
    1,2},{
    
    3,4}};
printf("array[0][0]=%d\n",array[0][0]);
printf("array[0][1]=%d\n",array[0][1]);
printf("array[1][0]=%d\n",array[1][0]);
printf("array[1][1]=%d\n",array[1][1]);
//采用遍历的方式
for(int i=0;i<2;i++)
{
    
    
	for(int j=0;j<2;j++)
	{
    
    
		printf("array[%d][%d]=%d\n",i,j,array[i][j]);
	}
}

2.1.2配列関数のパス値

void print_array(int array[2][2])//也可以写成int array[][2],但是不能写成int array[2][]
{
    
    
	for(int i=0;i<2;i++)
	{
    
    
		for(int j=0;j<2;j++)
		{
    
    
			printf("a[%d][%d]=%d\n",i,j,array[i][j]);
		}
	}
}
int main()
{
    
    
	int array[2][2]={
    
    {
    
    1,2},{
    
    3,4}};
	print_array(array);
	return 0;
}

2.2ポインタ表記

2.1.1配列要素の取得

int **array=(int **)malloc(2*sizeof(int *));
for(int i=0;i<2;i++)
{
    
    
	array[i]=(int *)malloc(2*sizeof(int));
}
int num=1
for(int i=0;i<2;i++)
{
    
    
	for(int j=0;j<2;j++)
	{
    
    
		array[i][j]=num++;
	}
}
for(int i=0;i<2;i++)
{
    
    
	for(int j=0;j<2;j++)
	{
    
    
		printf("a[%d][%d]=%d\n",i,j,array[i][j]);
	}
}

2.1.2配列関数のパス値

void print_array(int (*array)[2])
{
    
    
	for(int i=0;i<2;i++)
	{
    
    
		for(int j=0;j<2;j++)
		{
    
    
			printf("a[%d][%d]=%d\n",i,j,array[i][j]);
		}
	}
}
int main()
{
    
    
	int array[2][2]={
    
    {
    
    1,2},{
    
    3,4}};
	print_array(array);
	return 0;
}

3.メモリ上の2次元配列のマッピング

まず、次のように2次元配列の論理構造を見てみましょう。
ここに写真の説明を挿入
しかし実際には、下部にある多次元配列のメモリストレージは、1次元アレイのメモリストレージと同じです。

ここに写真の説明を挿入
コード検証は次のとおりです

	int array[2][2]={
    
    {
    
    1,2},{
    
    3,4}};
	printf("array[0][0]的地址:%p\n",&array[0][0]);
	printf("array[0][1]的地址:%p\n",&array[0][1]);
	printf("array[1][0]的地址:%p\n",&array[1][0]);
	printf("array[1][1]的地址:%p\n",&array[1][1]);

VC6.0の実行結果は次のとおりです
ここに写真の説明を挿入

3、アレイの実際の使用

コンパイラ-VC6.0

1. 1次元配列を使用して、1から100までの整数を格納し、それらを合計します

int a[100]={
    
    0};//初始化为0
int sum=0;
for(int i=0;i<100;i++)//赋值
{
    
    
	a[i]=i;
}
for(i=0;i<100;i++)		//求和
{
    
    
	sum+=a[i];
}
printf("从1加到100的和为:%d\n",sum);

2.グラフィック印刷

int a[4][1]={
    
    {
    
    1},{
    
    2},{
    
    3},{
    
    4}};
for(int i=0;i<4;i++)
{
    
    
	for(int j=1;j<=a[i][0];j++)
	{
    
    
		printf("*");
	}
	printf("\n");
}

結果は以下のとおりです。
ここに写真の説明を挿入

int a[4][1]={
    
    {
    
    1},{
    
    2},{
    
    3},{
    
    4}};
for(int i=0;i<4;i++)
{
    
    
	for(int k=5;k>a[i][0];k--)
		{
    
    
			printf("*");
		}
		
	
	printf("\n");

}

結果は以下のとおりです。
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44672122/article/details/108520799