二维数组

定义和使用:


二维数组定义的一般形式是:
    类型说明符 数组名[常量表达式1][常量表达式2]
其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。

int a[3][4];     命名规则同一维数组

定义了一个三行四列的数组,数组名为a其元素类型为整型,该数组的元素个数为3×4个。

二维数组a是按行进行存放的,先存放a[0]行,再存放a[1]行、a[2]行,并且每行有四个元素,也是依次存放的。

二维数组在概念上是二维的:其下标在两个方向上变化,对其访问一般需要两个下标。
在内存中并不存在二维数组,二维数组实际的硬件存储器是连续编址的,也就是说内存中只有一维数组,即放完一行之后顺次放入第二行,和一维数组存放方式是一样的。

 

#include <stdio.h>

int main()
{
	//定义了一个二维数组,名字叫a
	//由3个一维数组组成,这个一维数组是int [4]
	//这3个一维数组的数组名分别为a[0],a[1],a[2]
	int a[3][4];

	a[0][0] = 0;
	//……
	a[2][3] = 12;

	//给数组每个元素赋值
	int i = 0;
	int j = 0;
	int num = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			a[i][j] = num++;
		}
	}

	//遍历数组,并输出每个成员的值
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			printf("%d, ", a[i][j]);
		}
		printf("\n");
	}

	return 0;
}

 

  • 二维数组的初始化

 //分段赋值     int a[3][4] = {{ 1, 2, 3, 4 },{ 5, 6, 7, 8, },{ 9, 10, 11, 12 }};
    int a[3][4] = 
    { 
        { 1, 2, 3, 4 },
        { 5, 6, 7, 8, },
        { 9, 10, 11, 12 }
    };

    //连续赋值
    int a[3][4] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12  };

    //可以只给部分元素赋初值,未初始化则为0
    int a[3][4] = { 1, 2, 3, 4  };

    //所有的成员都设置为0
    int a[3][4] = {0};

    //[]中不定义元素个数,定义时必须初始化。
    int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8};

 

 

  • 数组名

                   数组名是一个地址的常量,代表数组中首元素的地址。

#include <stdio.h>

int main()
{
	//定义了一个二维数组,名字叫a
	//二维数组是本质上还是一维数组,此一维数组有3个元素
    //每个元素又是一个一维数组int[4]
	int a[3][4] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12  };

	//数组名为数组首元素地址,二维数组的第0个元素为一维数组
	//第0个一维数组的数组名为a[0]
	printf("a = %p\n", a);
	printf("a[0] = %p\n", a[0]);
	
	//测二维数组所占内存空间,有3个一维数组,每个一维数组的空间为4*4
	//sizeof(a) = 3 * 4 * 4 = 48
	printf("sizeof(a) = %d\n", sizeof(a));

	//测第0个元素所占内存空间,a[0]为第0个一维数组int[4]的数组名,4*4=16
	printf("sizeof(a[0]) = %d\n", sizeof(a[0]) );

	//测第0行0列元素所占内存空间,第0行0列元素为一个int类型,4字节
	printf("sizeof(a[0][0]) = %d\n", sizeof(a[0][0]));

	//求二维数组行数
	printf("i = %d\n", sizeof(a) / sizeof(a[0]));

	// 求二维数组列数
	printf("j = %d\n", sizeof(a[0]) / sizeof(a[0][0]));

	//求二维数组行*列总数
	printf("n = %d\n", sizeof(a) / sizeof(a[0][0]));

	return 0;
}

 

 

使用举例:

#include <stdio.h>

int main()
{
	//二维数组:  五行、三列
	//行代表人:  老大到老五
	//列代表科目:语、数、外
	float a[5][3] = { { 80, 75, 56 }, { 59, 65, 71 }, { 59, 63, 70 }, { 85, 45, 90 }, { 76, 77, 45 } };

	int i, j, person_low[3] = { 0 };
	float s = 0, lesson_aver[3] = { 0 };

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			s = s + a[j][i];
			if (a[j][i] < 60)
			{
				person_low[i]++;
			}
		}

		lesson_aver[i] = s / 5;
		s = 0;
	}

	printf("各科的平均成绩:\n");
	for (i = 0; i < 3; i++)
	{
		printf("%.2f\n", lesson_aver[i]);
	}
		
	printf("各科不及格的人数:\n");
	for (i = 0; i < 3; i++)
	{
		printf("%d\n", person_low[i]);
	}
		
	return 0;
}

 

 

 

多维数组:

 


多维数组的定义与二维数组类似,其语法格式具体如下:
    数组类型修饰符 数组名 [n1][n2]…[nn];

int a[3][4][5];
定义了一个三维数组,数组的名字是a,数组的长度为3,每个数组的元素又是一个二维数组,这个二维数组的长度是4,并且这个二维数组中的每个元素又是一个一维数组,这个一维数组的长度是5,元素类型是int。

#include <stdio.h>

int main()
{
	//int a[3][4][5] ;//定义了一个三维数组,有3个二维数组int[4][5]
	int a[3][4][5] = { { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 0 }, { 0 } }, { { 0 }, { 0 }, { 0 }, { 0 } }, { { 0 }, { 0 }, { 0 }, { 0 } } };

	int i, j, k;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			for (k = 0; k < 5; k++)
			{
				//添加访问元素代码
				printf("%d, ", a[i][j][k]);
			}
			printf("\n");
		}
	}
	return 0;
}

 

/*二级指针*/

#include <stdio.h>
int main(int argc, const char *argv[])
{
#if 1
	int a = 1;
	int *p1 = &a;
	int **p2;
	p2 = &p1;

	printf("p1 = %p\n",p1);
	printf("&p1 = %p\n",&p1);
	printf("p2 = %p\n",p2);
	printf("p1 = %p\n",*p2);
#endif
	int a1[2][3]= {1,2,3,4,5,6};
	int (*p)[3] = a1;
	printf("%d\n",**p);  //1
	return 0;
}

 

#include <stdio.h>

int main(int argc,const char* argv[])
{	
	char ch[3][3] = {1,2,3,4,5,6,7,8,9};
	int i,j;

	for (i = 0; i < 3; i ++) {
		for (j = 0; j < 3; j ++)
			printf("%12d",ch[i][j]);
		putchar(10);
	}
	 
	printf("&ch = %#x\n",&ch);                  //整个二维数组的首地址
	printf("&ch + 1 = %#x\n",&ch + 1);          // char(*)[3][3];整个二维数组的地址加1 +3*3*1=9;
	printf("&ch[1][0] = %#x\n",&ch[1][0]);      //第1行第1列首元素的地址
	printf("ch  + 1 = %#x\n",ch + 1);           /*二维数组的首行地址+1*/
	printf("ch[0] = %#x\n",ch[0]);              /*二维数组的第0行的第0个元素的地址*/
	printf("ch[0] + 1= %#x\n",ch[0] + 1);       /*二维数组的第0行的第1个元素的地址*/
	printf("ch[1] + 3 = %#x\n",ch[1] + 3);      /*二维数组的第1行的第3个元素的地址*/
	printf("*(ch[0] + 2) = %#x\n",*(ch[0] + 2));/*二维数组的第0行的第2个元素的值=====3*/

	printf("*ch[1] = %#x\n",*ch[1]);            /*二维数组的第1行的第0个元素的值====4*/
	printf("&ch[1] + 1 = %#x\n",&ch[1] + 1);    // ch + 1 + 1 /*二维数组的第2行的第0个元素的地址*/
	printf("*(*(ch + 1) + 1) = %#x\n",*(*(ch + 1) + 1));/*二维数组的第1行的第1个元素的值*/

	printf("*(*(&ch[0] + 1) + 1) + 1 = %#x\n",*(*(&ch[0] + 1) + 1) + 1);/*二维数组的第1行的第2个元素的值*/
	printf("ret = %#x\n",*(*(ch + 1) + 2) + *(*(&ch[1] + 1)) + 1 );	/*14*/
	
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值