C语言学习笔记:18_数组-二维数组

/*
 * 18_数组-二维数组.c
 *
 *  Created on: 2015年7月6日
 *      Author: zhong
 */
#include <stdio.h>
#include <stdlib.h>
/**
 * 二维数组:
 *   为什么要用二维数组呢;
 *   例如: 网络班有2个班,每班有5人。
 *   	要想存储一班的学生的年龄 定义一个一维数组搞定 int ages[5]={18,19,20,18,19};
 *   	然后将两个班中的所有年龄分开存入一个数组中  int classes[2]={ages,ages};
 *   	当然,在c语言中,一维数组的元素不能存放一个数组。
 *
 *   	int classes[2][50]={{18,19,20,18,19},{18,19,20,18,19}};
 *   	这样就定义一个二维数组,存放二个班的信息。
 *
 * 二维数组的定义 :
 * 		float a[3][4]; //3行,4列 3X4的数组
 * 		c语言对二维数组采用这样的定义方式,使得二维数组可被看作是一种特殊的一维数组,
 * 		这的元素又是一个一维数组。
 *
 *	二维数组的初始化:
 *	int a[3][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};//分别给二维数组所有元素赋值
 *	int a[3][4] ={{1},{1},{1}}; //也可以只给元素的一部分元素赋值,其它不赋值的元素被 初始化为0
 *		1 0 0 0
 *		1 0 0 0
 *		1 0 0 0
 *	int a[3][4]={{1},{1,2},{1,2,3}}; //随便你怎样子弄都行
 *		1 0 0 0
 *		1 2 0 0
 *		1 2 3 0
 *
 *   int a[][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};//如果赋值时全部赋值,可以省略第一维的长度,但不能省略第2维的长度。
 *   int a[][4]={{1,2,3,4},{ },{}};//这样也可以省略
 *
 * 		二维数组中的元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素
 * 		用矩阵形式表示二维数组,是逻辑上的概念,能形象地表示出行列的关系。
 * 		但在内存中,各元素是连续存放的,不是二维的,是线性的。就像二叉树一样。
 *
 * 访问二维数组的元素:
 *   数组名[下标][下标];
 *   	如 int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
 *   	a[0][0]; //取得第一个数组中的第一个元素 1
 *   	a[0][3]  //取得第一个数组中的第4个元素 4
 *   	a[1][0] //取得第二个数组中的第1个元素 5
 *   	//和一维数组一样,引用数组元素时,下标不要超过数组长度-1。数组角标越界是不报错的,但返回的结果是随机的,无意义的
 *
 */
/**
 * 将一个二维数组行和列的元素互换,存到另一个二维数组中
 * 如 a={{1,2,3},{4,5,6}};  --> b={{1,4},{2,5},{3,6}};
 */
void swap_row_column() {
	int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
	int b[3][2], i, j;

	printf("原数组\n");
	for (i = 0; i < 2; i++) { //i < 2; 这个2为数组a[2][3]中一维数组的长度
		for (j = 0; j < 3; j++) {
			printf("%5d", a[i][j]); //先打印原数组a
			b[j][i] = a[i][j]; //将a数组的元素赋值给b数组相应的元素 如 a[0][2] -->b[2][0] 行和列刚好互换
		}
		printf("\n");
	}

	printf("互换后的数组\n");
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 2; j++) {
			printf("%5d", b[i][j]); //打印新数组b
		}
		printf("\n");
	}
	/*
	 * output:
	 原数组
	 1    2    3
	 4    5    6
	 互换后的数组
	 1    4
	 2    5
	 3    6
	 */

}

//取得二维数组中的最大值,其它思路和一维数组是一样的,都是遍历第一个元素,将最大的保存下来
void array_max_() {
	int a[3][4] = { { 64, 76, 32, 12 }, { 45, 32, 1, 4 }, { 78, 3, 323, 5 } }; //随机数组
	int i, j; //c语言很不爽的就是,for循环里面的变量要在片面定义。妈b,麻烦

	int row = 0, colum = 0; //记录最大值所在的行和列
	int max = a[0][0]; //一定要给max初始化一个值,否则结果不是你想要的

	for (i = 0; i < 3; i++) { //外层循环是控制a[3][4]中的[3],即是二级数组中的第几个数组
		for (j = 0; j < 4; j++) { //内层循环控制的是第n个数组中的第n个元素
			if (a[i][j] > max) {
				max = a[i][j]; //记录下最大值,
				row=i;
				colum=j;
			}
		}
	}
	printf("二维数组中的最大值为:%d,坐标为(%d,%d)\n",max,row,colum);
	//output:二维数组中的最大值为:323,坐标为(2,2)
}

int main18() {
//	swap_row_column();
	array_max_();
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 14:07:03

C语言学习笔记:18_数组-二维数组的相关文章

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N

Swift语言学习No.2: 二维数组

之前在教程中学习了二维数组,原本里面很多知识点都不甚了解,后来经过一番资料查找,基本上理解透彻了,做个总结吧. 老规矩,先上代码: class Array2D<T> { let columns: Int let rows: Int var array: Array<T?> init(columns: Int, rows: Int) { self.columns = columns self.rows = rows array = Array<T?>(count:rows

PHP学习笔记十三【二维数组】

<?php //二维数组 $arr=array(array(1,2,3),array(4,5,6)); $arr1[0]=array(12,34,65); $arr1[1]=array(34,65,76); //遍历二维数组 for($i=0;$i<count($arr);$i++) { for($j=0;$j<count($arr[$i]);$j++) { echo $arr[$i][$j]." "; } echo "<br/>";

《Javascript权威指南》学习笔记之十二:数组、多维数组和符合数组(哈希映射)

Array(数组)是JavaScript中较为复杂的数据类型,同Java.C#.VB等程序语言的数组相比,Javascript数组中的元素不必为相同的数据类型,可以在数组每个元素上混合使用数字.日期.字符串.Object,甚至添加一个嵌套数组. 一.创建数组 1.var arr1 = new Array(); /var  arr2 = new Array(length); /var arr3 = new Array(element1,element2...); var arr4 = [eleme

C++ 一维数组 二维数组 指针

1.int a[3] = {1, 2, 3}a代表数组的首地址&a[0]也是数组的首地址 2.// int a[2][2] = {0, 1, 2, 3}; // **a 就是 a[0][0] 第一行第一列.// *(*a + 1) 就是 a[0][1] 第一行第二列.// **(a + 1) 就是 a[1][0] 第二行第一列.// *(*(a + 1) + 1) 就是 a[1][1] 第二行第二列. 3.int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9

数据结构 二维数组--&gt;稀疏数组--&gt;二维数组

稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不同的值 2>把具有不同值的元素行列及值记录在一个小规模数组中,从而缩小程序规模 row col val [0]   总行       总列 有效数量 [1]  第一个数据行  第一个数据列 第一个数据值 [2]  第二个数据行 第二个数据列 第二个数据值 二维数组==>稀疏数组思路: 1>遍

java笔记11之二维数组

格式1: 二维数组:就是元素为一维数组的一个数组 数据类型[][] 数组名 = new 数组类型[m][n] 其中m为行 n为列 注意: A:以下格式也可以表示二维数组            a:数据类型 数组名[][] = new 数据类型[m][n];            b:数据类型[] 数组名[] = new 数据类型[m][n];           B:注意下面定义的区别            int x;            int y;            int x,y;

C语言批量数据到动态二维数组

上一篇文章将文件读取放到静态创建的二维数组中,可是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能由于大量的数据而产生溢出呢,近期一直研究里malloc函数.通过它来动态建立所需的二维数组.因此.通过文件操作和动态创建二维数组结合起来,将大量的数据动态的放入矩阵中,不知道这种思想是否正确,下午把程序执行出来了.将程序贴上来.欢迎大家一起探讨:对于有规律的大数据txt文档怎样高效而准确的读入数组或矩阵中呢???指教!.谢谢 程序: #include<stdio.

【c语言】动态开辟一个二维数组

// 动态开辟一个二维数组 #include <stdio.h> #include <stdlib.h> int main() { int i = 0; int j = 0; int line = 0; int row = 0; int **p = NULL; printf("输入行数:"); scanf("%d", &line); printf("\n"); printf("输入列数:");