二维数组&指针

导言:二维数组在内存中以一维数组的形式存放,所以二维数组可以看成由若干个一维数组构成。

1、行地址&列地址​

?行地址:

a ↔ &a[0] (指向第0行)

a+i ↔ &a[i] (指向第i行)

?列地址:

a[0] ↔ &a[0][0] (指向第0行0列)

a[0]+i ↔ &a[0][i] (指向第0行i列)


2、行地址?列地址

  • 行地址指向一行元素(一个一维数组)
  • 列地址指向一个元素​

3、一维数组与二维数组的关系​​

一维数组的地址↔二维数组的行指针,指向该行元素,如&a[i] ↔ a+i​

一维数组的元素↔二维数组的行数组名,​指向该行第一个元素,如a[i] ↔ &a[i][0]


4、a?a[0]

a是二维数组名,行指针,增1指向下一行

a[0]是行数组名,列指针,增1指向下一列


?行指针

①定义:int (*p)[4];(定义了一个指针变量,指向含有4个元素的整型数组)

②初始化:p=a;或 p=&a[0];​

③引用

地址&a[i][j]→ *(p+i)+j​

元素a[i][j]→ p[i][j] ↔ * (p[i]+j) ↔ * (* (p+i)+j) ↔ (*(p+i))[j]

?列指针

①定义:int *p;(将二维数组看成m行n列的一维数组)​

②初始化:p=*a;或 p=a[0];或 p=&a[0][0];

③引用​

地址&a[i][j] → &p[i*n+j]​

元素a[i][j] → p[i* n+j] ↔ * (p+i*n+j)


示例:输入一个3行4列的二维数组并输出

方法1——二维数组作形参

#include <stdio.h>
#define N 4
void InputArray(int p[][N], int m, int n);  
void OutputArray(int p[][N], int m, int n);  

int main()
{ 
	int  a[3][4];
	printf("Input 3*4 numbers:\n");                             
	InputArray(a, 3, 4);   /* 向函数传递二维数组的第0行的地址 */                      
	OutputArray(a, 3, 4);  /* 向函数传递二维数组的第0行的地址 */
	return 0;
}
/* 形参声明为列数已知的二维数组,输入数组元素值 */
void InputArray(int p[][N], int m, int n) 
{	
	int i, j;
	for(i = 0; i<m; i++)
		for(j = 0; j<n; j++)
			scanf("%d", &p[i][j]);         
}
/* 形参声明为列数已知的二维数组,输出数组元素值 */
void OutputArray(int p[][N], int m, int n)
{
	int i, j;
	for(i = 0; i<m; i++)
	{ 
		for(j = 0; j<n; j++)
			printf("%4d", p[i][j]); 
			        
		printf("\n");
	}
}

方法2——行指针作形参

#include <stdio.h>
#define N 4
void InputArray(int (*p)[N], int m, int n);  
void OutputArray(int (*p)[N], int m, int n);  

int main()
{ 
	int  a[3][4];
	printf("Input 3*4 numbers:\n");                             
	InputArray(a, 3, 4);   /* 向函数传递二维数组的第0行的地址 */                      
	OutputArray(a, 3, 4);  /* 向函数传递二维数组的第0行的地址 */
	return 0;
}

/* 形参声明为指向列数已知的二维数组的行指针,输入数组元素值 */
void InputArray(int (*p)[N], int m, int n)   
{	
	int i, j;
	for(i = 0; i<m; i++)
		for(j = 0; j<n; j++)
			scanf("%d", *(p+i)+j);         	
}
/* 形参声明为指向列数已知的二维数组的行指针,输出数组元素值 */
void OutputArray(int (*p)[N], int m, int n)
{
	int i, j;
	for(i = 0; i<m; i++)
	{ 
		for(j = 0; j<n; j++)
			printf("%4d", *(*(p+i)+j));  
		       
		printf("\n");
	}
}

方法3——列指针作形参(推荐,二维列数动态可变)

#include <stdio.h>
void InputArray(int *p, int m, int n);  
void OutputArray(int *p, int m, int n);  

int main()
{ 
	int  a[3][4];
	printf("Input 3*4 numbers:\n");
	InputArray(*a, 3, 4);   /* 向函数传递二维数组的第0行第0列的地址 */                      
	OutputArray(*a, 3, 4);  /* 向函数传递二维数组的第0行第0列的地址 */   
	return 0;
}
/* 形参声明为指向二维数组的列指针,输入数组元素值 */
void InputArray(int *p, int m, int n)   
{	
	int i, j;
	for(i = 0; i<m; i++)
		for(j = 0; j<n; j++)
			scanf("%d", &p[i*n+j]);         
}
/* 形参声明为指向二维数组的列指针,输出数组元素值 */
void OutputArray(int *p, int m, int n)
{
	int i, j;
	for(i = 0; i<m; i++)
	{ 
		for(j = 0; j<n; j++)
			printf("%4d", p[i*n+j]);         
		
		printf("\n");
	}
}
发布了23 篇原创文章 · 获赞 7 · 访问量 1989

猜你喜欢

转载自blog.csdn.net/weixin_44641176/article/details/100058179