二维数组与数组指针以及指针数组

二维数组与数组指针以及指针数组

  • 二维数组定义
    int buff[3][5];
    第一个[3] 表示二维数组buff中有3个一位数组
    第二个[5] 表示每个一维数组中有5个成员。
    若二维数组定义时进行初始化则第一个[]可以不填。第二个[]不能省略。
    buff表示第0行的整体地址。即:&buff[0], buff类型为:int (*)[5]
    buff[0]表示第0行的首地址。即:&buff[0][0], buff[0]类型为int *
    buff[0][0]表示第0行第0列的值。

示例:

int buff[][3]={
    
    1,2,3,4,5,6};//每行有3个元素
int buff2[][3]={
    
    
            {
    
    1,2,3},
            {
    
    4,5,6},
}; 
//部分初始化,数组中未赋值的默认为0
int buff3[][3]={
    
    
             {
    
    1,2,3,},
             {
    
    },
             {
    
    4,5,6},
};
   //初始化自动计算行数,数组中未赋值的默认为0
int buff3[][3]={
    
    
             {
    
    },
             {
    
    },
             {
    
    },
};
  int buff[3][3];//定义二维数组直接限制行、列,未初始化成员为随机值
}; 

注:此处举例均为局部二维数组

  • 二维数组遍历
  • 示例一:
int main()
{
    
    
	int buff[][3]={
    
    1,2,3,4,5,6};//每行有3个元素
	int i,j;
	for(i=0;i<sizeof(buff)/sizeof(buff[0]);i++)
	{
    
    
		for(j=0;j<sizeof(buff[0])/sizeof(int);j++)
		{
    
    
			printf("%d ",buff[i][j]);	
		}	
		printf("\n");
	}
}
  • 示例二
#include <stdio.h>
int main()
{
    
    
	int buff[][3]={
    
    1,2,3,4,5,6};//每行有3个元素
	int *p=buff[0];
	int i;
	for(i=0;i<sizeof(buff)/sizeof(int);i++)
	{
    
    
		printf("%d ",p[i]);	
	}
}
  • 二维数组作为形参处传入
  • 以数组方式传入
#include <stdio.h>
void tow_array(int buff[][3],int line);
int main()
{
    
    
	int buff[][3]={
    
    1,2,3,4,5,6};//每行有3个元素
	tow_array(buff,sizeof(buff)/sizeof(buff[0]));
}
/************遍历二维数组*****************
**
**以数组方式传入,必须指定列宽
**int line  -- 二维数组行数
****************************************/
void tow_array(int buff[][3],int line)
{
    
    
	int i,j;
	for(i=0;i<line;i++)
	{
    
    
		for(j=0;j<3;j++)
		{
    
    
			printf("%d ",buff[i][j]);	
		}	
		printf("\n");
	}
}
  • 以数组指针传入
#include <stdio.h>
void tow_array(int (*buff)[3],int line);
int main()
{
    
    
	int buff[][3]={
    
    1,2,3,4,5,6};//每行有3个元素
	tow_array(buff,sizeof(buff)/sizeof(buff[0]));
}
/************遍历二维数组*****************
**
**以数组指针方式传入,必须指定列宽
**int line  -- 二维数组行数
****************************************/
void tow_array(int (*buff)[3],int line)
{
    
    
	int i,j;
	for(i=0;i<line;i++)
	{
    
    
		for(j=0;j<3;j++)
		{
    
    
			printf("%d ",*(buff[i]+j));	
		}
		printf("\n");
	}
}
  • 数组指针
    定义:int (p)[n];指向数组整体的指针。数组指针类型:int ()[n]
    ()优先级高,所以(*p)是一个指针,指向一个整型的一维数组,一维数组的成员个数位n,也就是说p的步长为n。即p+1偏移的地址为n个int型长度。因此数组指针也称为行指针。
    优先级: () > [] > *
    示例:
#include <stdio.h>
int main()
{
    
    
	int buff[][3]={
    
    1,10,3,4,5,6};//每行有3个元素
	int (*p)[3]=buff;
	printf("*p[0]=%d\n",*p[0]);//等价于buff[0][0]
	printf("*(p[0]+1)=%d\n",*(p[0]+1));//等价于buff[0][1]
	printf("*p[1]=%d\n",*p[1]);//等价于buff[1][0]
}
  • 指针数组
    定义:int* p[n];数组中保存int*指针。指针数组类型:int *[n],p的类型是int **,p+1偏移的地址为:sizeof(int )。
    []的优先级高,[]和p组合成一个数组,int
    和p[]组合成指针数组,他有n个指针类型的数组元素,即数组中的每一个元素都是int型指针。
    优先级: () > [] > *
    将二维数组赋个指针数组示例
#include <stdio.h>
void tow_array(int (*buff)[3],int line);
int main()
{
    
    
	int buff[][3]={
    
    1,10,3,4,5,6};//每行有3个元素
	int *p[3];
	*p=buff[0];
	p[0]=buff[0];
	p[1]=buff[1];
	p[2]=buff[2];
	printf("%d\n",(*p)[0]);//等价于:p[0][0]
	printf("%d\n",(*p)[1]);//等价于p[0][1]
	printf("%d\n",*(p[0]+1));//等价于p[0][1]
	printf("%d\n",*(p+1)[0]);//等价于p[1][0],*(p+1)保存buf[1][0]地址
	printf("%d\n",*(*(p+1)+1));//等价于p[1][1]
}

注:二维数组赋值给指针数组时p=buff是错误的。

  • 二维数组通过二维指针方式传入
    示例一:
#include <stdio.h>
void tow_array(char **buff,int line);
int main()
{
    
    
	int i;
	char *buff[]={
    
    "123",
				"123456",
				"123456789",
				"字符串口测试"
				};
	tow_array(buff,sizeof(buff)/sizeof(buff[0]));
}
/************遍历二维数组*****************
**
**以二维指针传入
**int line  -- 二维数组行数
****************************************/
void tow_array(char **buff,int line)
{
    
    
	int i,j;
	for(i=0;i<line;i++)
	{
    
    
		printf("%s\n",*(buff+i));
	}
}

示例二:

#include <stdio.h>
void tow_array(int **buff,int line,int row);
int main()
{
    
    
	int i;
	int buff[][3]={
    
    1,10,3,4,5,6};//每行有3个元素
	int *p[3];
	//将二维数组赋值给指针数组
	for(i=0;i<sizeof(buff)/sizeof(buff[0]);i++)
	{
    
    
		*(p+i)=buff[i];//或p[i]=buff[i];	
	}
	tow_array(p,sizeof(buff)/sizeof(buff[0]),3);
}
/************遍历二维数组*****************
**
**以二维指针传入
**int line  -- 二维数组行数
**int row   -- 二维数组列
****************************************/
void tow_array(int **buff,int line,int row)
{
    
    
	int i,j;
	for(i=0;i<line;i++)
	{
    
    
		for(j=0;j<row;j++)
		{
    
    
			printf("%d\n",*(*(buff+i)+j));//或者buff[i][j]
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44453694/article/details/112796624