精华内容
下载资源
问答
  • C语言多维数组

    2021-01-14 17:56:27
    C语言多维数组 一、一维数组 1.数组名 2.下标引用 3.数组和指针 4.作为函数参数的数组名 二、多维数组 1.数组名 2.指向数组的指针(数组指针) //方式一 void test01(){ //先定义数组类型,再用数组类型...

    C语言多维数组

    一、一维数组

    在这里插入图片描述

    1.数组名

    在这里插入图片描述
    在这里插入图片描述

    2.下标引用

    在这里插入图片描述

    3.数组和指针

    在这里插入图片描述

    4.作为函数参数的数组名

    在这里插入图片描述

    二、多维数组

    在这里插入图片描述

    1.数组名

    在这里插入图片描述

    2.指向数组的指针(数组指针)

    在这里插入图片描述

    //方式一
    void test01(){
    
    	//先定义数组类型,再用数组类型定义数组指针
    	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    	//有typedef是定义类型,没有则是定义变量,下面代码定义了一个数组类型ArrayType
    	typedef int(ArrayType)[10];
    	//int ArrayType[10]; //定义一个数组,数组名为ArrayType
    
    	ArrayType myarr; //等价于 int myarr[10];
    	ArrayType* pArr = &arr; //定义了一个数组指针pArr,并且指针指向数组arr
    	for (int i = 0; i < 10;i++){
    		printf("%d ",(*pArr)[i]);
    	}
    	printf("\n");
    }
    
    //方式二
    void test02(){
    
    	int arr[10];
    	//定义数组指针类型
    	typedef int(*ArrayType)[10];
    	ArrayType pArr = &arr; //定义了一个数组指针pArr,并且指针指向数组arr
    	for (int i = 0; i < 10; i++){
    		(*pArr)[i] = i + 1;
    	}
    	for (int i = 0; i < 10; i++){
    		printf("%d ", (*pArr)[i]);
    	}
    	printf("\n");
    
    }
    
    //方式三
    void test03(){
    	
    	int arr[10];
    	int(*pArr)[10] = &arr;
    
    	for (int i = 0; i < 10; i++){
    		(*pArr)[i] = i + 1;
    
    	}
    	for (int i = 0; i < 10; i++){
    		printf("%d ", (*pArr)[i]);
    	}
    	printf("\n");
    }
    
    

    3.指针数组(元素为指针)

    栈区指针数组

    //数组做函数函数,退化为指针
    void array_sort(char** arr,int len){
    
    	for (int i = 0; i < len; i++){
    		for (int j = len - 1; j > i; j --){
    			//比较两个字符串
    			if (strcmp(arr[j-1],arr[j]) > 0){
    				char* temp = arr[j - 1];
    				arr[j - 1] = arr[j];
    				arr[j] = temp;
    			}
    		}
    	}
    
    }
    
    //打印数组
    void array_print(char** arr,int len){
    	for (int i = 0; i < len;i++){
    		printf("%s\n",arr[i]);
    	}
    	printf("----------------------\n");
    }
    
    void test(){
    	
    	//主调函数分配内存
    	//指针数组
    	char* p[] = { "bbb", "aaa", "ccc", "eee", "ddd"};
    	//char** p = { "aaa", "bbb", "ccc", "ddd", "eee" }; //错误
    	int len = sizeof(p) / sizeof(char*);
    	//打印数组
    	array_print(p, len);
    	//对字符串进行排序
    	array_sort(p, len);
    	//打印数组
    	array_print(p, len);
    }
    
    

    堆区指针数组

    //分配内存
    char** allocate_memory(int n){
    	
    	if (n < 0 ){
    		return NULL;
    	}
    
    	char** temp = (char**)malloc(sizeof(char*) * n);
    	if (temp == NULL){
    		return NULL;
    	}
    
    	//分别给每一个指针malloc分配内存
    	for (int i = 0; i < n; i ++){
    		temp[i] = malloc(sizeof(char)* 30);
    		sprintf(temp[i], "%2d_hello world!", i + 1);
    	}
    
    	return temp;
    }
    
    //打印数组
    void array_print(char** arr,int len){
    	for (int i = 0; i < len;i++){
    		printf("%s\n",arr[i]);
    	}
    	printf("----------------------\n");
    }
    
    //释放内存
    void free_memory(char** buf,int len){
    	if (buf == NULL){
    		return;
    	}
    	for (int i = 0; i < len; i ++){
    		free(buf[i]);
    		buf[i] = NULL;
    	}
    
    	free(buf);
    }
    
    void test(){
    	
    	int n = 10;
    	char** p = allocate_memory(n);
    	//打印数组
    	array_print(p, n);
    	//释放内存
    	free_memory(p, n);
    }
    
    

    4.二维数组三种参数形式

    二维数组的线性存储特性

    void PrintArray(int* arr, int len){
    	for (int i = 0; i < len; i++){
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    
    //二维数组的线性存储
    void test(){
    	int arr[][3] = {
    		{ 1, 2, 3 },
    		{ 4, 5, 6 },
    		{ 7, 8, 9 }
    	};
    
    	int arr2[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    	int len = sizeof(arr2) / sizeof(int);
    
    	//如何证明二维数组是线性的?
    	//通过将数组首地址指针转成Int*类型,那么步长就变成了4,就可以遍历整个数组
    	int* p = (int*)arr;
    	for (int i = 0; i < len; i++){
    		printf("%d ", p[i]);
    	}
    	printf("\n");
    
    	PrintArray((int*)arr, len);
    	PrintArray((int*)arr2, len);
    }
    
    

    二维数组的3种形式参数

    //二维数组的第一种形式
    void PrintArray01(int arr[3][3]){
    	for (int i = 0; i < 3; i++){
    		for (int j = 0; j < 3; j++){
    			printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);
    		}
    	}
    }
    
    //二维数组的第二种形式
    void PrintArray02(int arr[][3]){
    	for (int i = 0; i < 3; i++){
    		for (int j = 0; j < 3; j++){
    			printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);
    		}
    	}
    }
    
    //二维数组的第二种形式
    void PrintArray03(int(*arr)[3]){
    	for (int i = 0; i < 3; i++){
    		for (int j = 0; j < 3; j++){
    			printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);
    		}
    	}
    }
    
    void test(){
    	
    	int arr[][3] = { 
    		{ 1, 2, 3 },
    		{ 4, 5, 6 },
    		{ 7, 8, 9 }
    	};
    	
    	PrintArray01(arr);
    	PrintArray02(arr);
    	PrintArray03(arr);
    }
    
    

    三、总结

    1.编程提示

    在这里插入图片描述

    2.内容总结

    在这里插入图片描述

    展开全文
  • C语言多维数组的一种新教学方法.pdf
  • c语言 多维数组

    2020-10-17 11:44:43
    多维数组 #include<stdio.h> #define MONTHS 12 #define YEARS 5 int main() { const float rain[YEARS][MONTHS] = { {4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6}, {8.5, 8.2, 1.2, ...

    多维数组

    #include<stdio.h>
    #define MONTHS 12
    #define YEARS 5
    
    int main()
    {
    	const float rain[YEARS][MONTHS] = {
    		{4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
    		{8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
    		{9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.3},
    		{7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
    		{7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}
    	};
    	int year, month;
    	float subtot, total;
    
    	printf(" YEAR    RAINFALL (inches)\n");
    	for ( year = 0, total=0; year < YEARS; year++)
    	{	// 每一年,各月的降水量总和
    		for (month = 0, subtot = 0; month < MONTHS; month++)
    		{
    			subtot += rain[year][month];
    		}
    		printf("%5d %15.1f\n", 2010 + year, subtot);
    		total += subtot;
    	}
    	printf("\nThe yearly average is %.1f inches.\n\n", total / YEARS);
    	printf("MONTHLY AVERAGES:\n\n");
    	printf(" Jan  Feb  Mar  Apr  May Jun  Jul  Aug  Sep  Oct  Nov  Dec\n");
    
    	for ( month = 0; month < MONTHS; month++)
    	{	// 每个月,5年的总降水量
    		for ( year = 0; year < YEARS; year++)
    		{
    			subtot += rain[year][month];
    		}
    		printf("%4.1f  ", subtot / YEARS);
    	}
    	printf("\n");
    	return 0;
    }
    

    在这里插入图片描述

    展开全文
  • C语言多维数组遍历教程C语言for循环遍历多维数组详解语法for (i = 0; i < row; i++){for (j = 0; j < col; j++){//arr[i][j]}}参数参数描述arr数组名。row二维数组的行数。col二维数组的列数。说明我们使用 ...

    C语言多维数组遍历教程

    C语言for循环遍历多维数组详解

    语法

    for (i = 0; i < row; i++)

    {

    for (j = 0; j < col; j++)

    {

    //arr[i][j]

    }

    }

    参数

    参数

    描述

    arr

    数组名。

    row

    二维数组的行数。

    col

    二维数组的列数。

    说明

    我们使用 for 循环,首先遍历数组的每一行,接着,在该循环里面,嵌套一层循环,遍历每一行里面的每一列元素。

    C语言while循环遍历多维数组详解

    语法

    while (i < row)

    {

    int j = 0;

    while (j < col)

    {

    //arr[i][j]

    j++;

    }

    i++;

    }

    参数

    参数

    描述

    arr

    数组名。

    row

    二维数组的行数。

    col

    二维数组的列数。

    说明

    我们使用 while 循环,首先遍历数组的每一行,接着,在该循环里面,嵌套一层循环,遍历每一行里面的每一列元素。

    C语言do while循环遍历多维数组详解

    语法

    do

    {

    int j = 0;

    do

    {

    //arr[i][j]

    j++;

    }while (j < col);

    i++;

    }while (i < row);

    参数

    参数

    描述

    arr

    数组名。

    row

    二维数组的行数。

    col

    二维数组的列数。

    说明

    我们使用 do while 循环,首先遍历数组的每一行,接着,在该循环里面,嵌套一层循环,遍历每一行里面的每一列元素。

    案例

    for循环多维数组遍历

    我们可以通过 for 循环加索引的形式遍历二维数组

    #include

    int main(){

    printf("嗨客网(www.haicoder.net)\n\n");

    // C语言二维数组 for 遍历

    int arr[3][5] = {

    {11, 12, 13, 14, 15},

    {21, 22, 23, 24, 25},

    {31, 32, 33, 34, 35}

    };

    int i = 0;

    for (i = 0; i < 3; i++)

    {

    int j = 0;

    for (j = 0; j < 5; j++)

    {

    printf("%d ", arr[i][j]);

    }

    printf("\n");

    }

    return 0;

    }

    程序运行后,控制台输出如下:

    ce2a9d257883335e842db5a4b4719b1d.png

    我们创建了一个两行两列的二维数组,并使用初始化的方式给数组赋初值。接着,我们使用 for 循环的形式遍历数组的每一个元素。

    遍历时,我们首先,遍历数组的每一行,接着,在每一行的遍历里面,继续嵌套一层循环,遍历每一行里面的每一列的元素,从而遍历了数组的整个元素。

    while循环多维数组遍历

    我们可以通过 while 循环加索引的形式遍历二维数组

    #include

    int main(){

    printf("嗨客网(www.haicoder.net)\n\n");

    // C语言二维数组 while 遍历

    int arr[3][5] = {

    {11, 12, 13, 14, 15},

    {21, 22, 23, 24, 25},

    {31, 32, 33, 34, 35}

    };

    int i = 0;

    while (i < 3)

    {

    int j = 0;

    while(j < 5)

    {

    printf("%d ", arr[i][j]);

    j++;

    }

    i++;

    printf("\n");

    }

    return 0;

    }

    程序运行后,控制台输出如下:

    0f8db2e66992eee56396db9a50ea4be8.png

    我们创建了一个两行两列的二维数组,并使用初始化的方式给数组赋初值。接着,我们使用 while 循环的形式遍历数组的每一个元素。

    注意,我们在使用 while 循环遍历数组的元素时,遍历完每一行之后,一定要加当前的行数加一,遍历完列之后,同样需要加当前的列加一,否则会死循环。

    do while循环多维数组遍历

    我们可以通过 do while 循环加索引的形式遍历二维数组

    #include

    int main(){

    printf("嗨客网(www.haicoder.net)\n\n");

    // C语言二维数组 do while 遍历

    int arr[3][5] = {

    {11, 12, 13, 14, 15},

    {21, 22, 23, 24, 25},

    {31, 32, 33, 34, 35}

    };

    int i = 0;

    do

    {

    int j = 0;

    do

    {

    printf("%d ", arr[i][j]);

    j++;

    }while(j < 5);

    i++;

    printf("\n");

    }while (i < 3);

    return 0;

    }

    程序运行后,控制台输出如下:

    f911a619ca4714f11c050a8776d037ba.png

    我们创建了一个两行两列的二维数组,并使用初始化的方式给数组赋初值。接着,我们使用 while 循环的形式遍历数组的每一个元素。

    C语言数组遍历总结

    C 语言的多维数组的遍历,有三种方式,分别为:通过 for 循环、 通过 while 循环和 do while 循环的方式。

    展开全文
  • 原标题:单片机C语言多维数组多维数组对于二维数组a[4][6];由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a[0][0]地址的数字是相同的,但是意义却是不同的。 对于该数组我们可以理解为:a的一维数组(第一...

    原标题:单片机C语言多维数组

    多维数组

    对于二维数组a[4][6];由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a[0][0]地址的数字是相同的,但是意义却是不同的。 对于该数组我们可以理解为:a的一维数组(第一层),它有四个元素a[0]、a[1]、a[2]、a[3](第二层),而每个元素又含有6个元素a[0] [0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5](第三层),…到此我们终于访问到了每个元素了,这个过程我们 经历了:a->a[0]->a[0][0];

    整体来讲:a是一个4行5列的二维数组,a表示它指向的数组的首地址(第一个元素地址&a[0]),同时a[0]指向一行,它是这个行的名字 (和该行的第一个元素的首地址相同(第一个元素为地址&a[0][0]))。所以从数字角度说:a、a[0]、&a[0][0]是相同 的,但是他们所处的层次是不同的。

    既然a代表二维数组,那么a+i就表示它的第i+1个元素*(a+i)的地址,而在二维数组中

    *(a+i)又指向一个数组,*(a+i)+j表示这个数组的第j+1个元素的地址,所以要访问这个元素可以使用 *(*(a+i)+j)(也就是a[i][j])。

    他们的示意图为(虚线代表不是实际存在的):

    ebcc41e5f3ca160ccb4215e2e8738dec.png

    对照这个图,如下的一些说法都是正确的(对于a[4][6]):

    a是一个数组类型,*a指向一个数组;

    a+i指向一个数组;

    a、*a和&a[0][0]数值相同;

    a[i]+j和*(a+i)+j是同一个概念;

    总结一下就是:我们对于二维指针a,他指向数组a[0,1,2,3],使用*,可以使他降级到第二层次,这样*a就指向了第一个真正的数组。对于其他的情况我们也可以采用相同的方式,对于其他维数和类型的数组我们可以采用相类似的思想。

    说到指向数组的指针,我们还可以声明一个指针变量让它指向一个数组。例如:

    int (*p)[5];

    这时p就是一个指针,要指向一个含有5个int类型元素的数组,指向其他的就会出现问题。这个时候我们可以使用上面的什么东西来初始化呢?我们可以使用*a,*(a+1),a[2]等。原因很简单:我们在一个二维的数组中,那么表达方式有上面的相互类似的意义呢?只有 *a,*(a+1),a[2]等。

    本文章来源网络,如果原作者不支持咱们转发,请联系删除,谢谢!

    技术源于积累,成功来自执着返回搜狐,查看更多

    责任编辑:

    展开全文
  • C语言多维数组教程一般我们使用最多的就是二维数组,很少用到三维数组,更多维的数组几乎更用不到。C语言二维数组详解定义C 语言的二维数组,就是数组的每一个元素都是一个一维数组。语法type arrName[row][col]参数...
  • c语言 多维数组c语言 多维数组一、高维数组有时,数组的维数并不止一维,例如一个记录消费中心在第一季度里各个月的收入数据就可以用二维数组来表示。定义二维数组的方法是在一维数组定义的后面再加上一个用方括号括...
  • C语言多维数组与指针

    2020-07-18 00:28:04
    C语言数组和指针之间存在一些千丝万缕的联系,搞不清楚的情况下非常容易出错,在前一段时间我写过关于数组和指针的分析,但是还是存在很多不清楚的问题,特别是当出现一些复杂的问题时,这种情况更加的复杂。...
  • C语言多维数组的申明:long cArr[3][10];VB语言的多维数组的申明:dim vbArr(2,9) as long,这里假设Option Base 0,这里只说数组数据的实际存储,不考虑SafeArr结构,关于vb数组的SafeArr结构测试在另外一篇文章中。...
  • C语言基础第7章多维数组7.2 二维数组及多维数组二维数组的定义定义方式: 数据类型 数组名[常量表达式][常量表达式];;二维数组理解;二维数组元素的引用形式: 数组名[下标][下标]二维数组元素的初始化分行初始化...
  • C语言多维数组与指针的关系 int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}}; printf("int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}}\n"); puts(""); printf("arr : %p\n",arr); printf("*arr : %p\n",*...
  • C语言多维数组和指针

    2021-05-07 21:45:45
    C primer plus 多维数组的总结 理解zippo是地址的地址 先声明一个int类型的多维数组: int zippo[4][2] ; ...
  • 多维数组对于二维数组a[4][6];由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a[0][0]地址的数字是相同的,但是意义却是不同的。 对于该数组我们可以理解为:a的一维数组(第一层),它有四个元素a[0]、a[1]...
  • 设有整型二维数组a[3][4]如下:0 1 2 34 5 6 78 9 10 11它的定义为:int a[3][4]={{0,1,2,3},{...前面介绍过,C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0]、a[1]、a[2...
  • C语言多维数组的问题

    2019-10-02 17:17:14
    C语言中定义多维数组 char x[3][5][7][3][9][23]= { { //x[0]之后 "23452212134245", "avdertsdsa", "widnows xp", "widnows vist", "windows 7" "win8" }, { //x[1]之后 "liux",...
  • 多维数组本质技术推演 int a[10]; char myarray[3][5] PK int (*p)[5] myarray名称到底是什么? 多维数组char a[i][j] ==> ((a+i)+j)转换技巧分析 void main222() { int a[3][5]; int c[5]; //&c + 1; int b...
  • 要谈多维数组,首先先了解下一维数组的指针应用。 int arr[10]; 通过上述代码,我们定义了一个长度为10的整形数组。 int为数组的基类型,他确定了每个数组元素所占用的空间。在visual studio编译器中int占4个字节。...
  • 1.指向指针的指针 指针的本质是变量,指针会占用一定的内存空间,我们可以...小结 C语言中只支持一维数组数组大小必须在编译期就作为常数确定,C语言中的数组元素可以是任何类型的数据,数组的元素可以是另一个数组
  • c语言多维数组与指针

    千次阅读 2019-01-12 13:28:12
    而一维数组相对于多维数组来说很简单的,然而数组a就表示的是整个数组内存段的首地址也就是0X01,那可可想而知变量a存得值就是一个地址,到此不难看出a就是一个指针。。。(不理解的可以看看我之前呢写的有关指...
  • 当使用到ASCII码字库点阵的时候,我们习惯定义一个大的数组来存放。如果没有指定存储区域,数组一般都是保存在RAM当中的,如果单片机的RAM空间比较紧张,就需要将数组保存在ROM当中。对于51单片机,如果只在数组前加...
  • C语言多维数组初始化

    千次阅读 2019-05-28 13:41:00
    由于剧情,需要C语言实现图像算法。但作为一名MATLAB老用户,根本不知“指针”“内存”为何物。开始自信满满,结果连初始化一个二维全零矩阵都不会(尴尬)。 顾从零学起,在此总结,供跟我一样的选手学习交流。
  • 多维数组做函数参数退化原因大剖析 //证明一下多维数组的线性存储 //线性打印 void printfArray411(int *array, int num) { int i = 0; for (i=0; i<num ; i++) { printf("%d ", array[i]); } } void printfArray...
  • 方法一:常规法老老实实传二维数组。void print1(int arr[3][5], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf("%d ", arr[i][j]);}printf("\n");}}...
  • C语言多维数组,结构体解析

    千次阅读 2018-06-22 20:54:10
    首先讲解一个误区int a[5] = {0}; printf("a : %d\n", a); printf("&amp;a : %d\n"...我们都知道a代表数组的首地址,&...a也是数组的地址,所以它们输出的结果是一样的,那么为什么a+

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,639
精华内容 6,255
关键字:

c语言多维数组

c语言 订阅