指向二维数组的指针+用typedef定义行指针和数组

上一篇文章:内存编址+C语言指针+指针作为函数参数+指向一维数组的指针

指向二维数组的指针

int a[3][4]=
{
	{1,4,2,5},
	{5,4,7,6},
	{2,8,9,4},
};

定义一个二维数组:该数组有三行四列。二维数组可以看成特殊的一维数组。数组名a代表数组的起始地址,a[0]代表第一行第一个元素的地址,所以a和a[0]的地址是一样的,但是不能用*a来访问a[0]的内容
在这里插入图片描述
a代表第一行的地址,a+1代表第二行的地址,a+2代表第三行的地址。a+1的地址与a[1]的地址相同,但是不能用*(a+1)来访问a[1]的内容
在这里插入图片描述
*(a+1)输出的是a[1]的地址。

a[0]是第一行第一个元素的地址,a[0]+1是第一行第二个元素的地址,a[0]+2是第一行第三个元素的地址,a[0]+3是第一行第四个元素的地址,通过对地址使用取内容符*输出第一行元素:
在这里插入图片描述

行指针

行指针指是向一维数组的指针,指的是一整行,不是某一个元素。(指针可以指向很多东西,指针可以指向变量,可以指向字符串,可以指向函数,这里说的就是指向一个一维数组
行指针(即指向一维数组的指针的定义格式)定义格式:数据类型 (*指针变量名)[n]; 括号不可省略,否则就变成了指针数组。

定义行指针p,p指向三行四列的数组a,行指针p每移动一次,将跨过4个元素指向下一行的首地址。

用行指针变量输出整个二维数组的元素

#include <stdio.h>
int main()
{
	int i,j;
	int (*p)[4];
	int a[3][4]=
	{
		{1,4,2,5},
		{5,4,7,6},
		{2,8,9,4},
	};
	p=a;//也可写成p=a[0]  或  p=&a[0] 
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
			printf("%d ",*(*p+i)+j);
		putchar('\n');
	}
	return 0;
}

在这里插入图片描述

用typedef定义行指针

首先要知道typedef的使用形式:typedef 标准类型名 别名;
例如:

typedef int INTEGER;

为标准类型int定义一个别名,可以使用INTEGER来定义变量

INTEGER a,b;

用typedef定义行指针,如下图:
在这里插入图片描述
typedef也可以定义数组(一维数组和二维数组都可以用typedef),如下:
在这里插入图片描述
typedef也可以定义指针:

typedef int* POINT;
POINT p1, p2, p3, p4;

关于typedef,后面的的文章也会提到:C语言结构体数组+结构体类型指针+指向结构体数组的指针+typedef类型

列指针

列指针指向二维数组中某一行的具体元素。

使用列指针输出二维数组

#include <stdio.h>
int main()
{
	int a[3][4]=
	{
		{1,4,2,5},
		{5,4,7,6},
		{2,8,9,4}
	};
	int *p=a[0];
//定义一个指针变量p,把它当作列指针,给他赋第一行第一个元素的地址 
	for(;p < a[0] + 12; p++)
	{
		printf("%d ",*p);
		if((p+1-a[0])%4==0)putchar('\n');//如果已经输出了四个就换行
	} 
	return 0;
} 

在这里插入图片描述

使用列指针找出二维数组中的最大值

使用列指针找出二维数组中的最大值,并输出行号和列号。

#include <stdio.h>
int main()
{
	int a[3][4]=
	{
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}   //最后这里可以加一个逗号也可以不加
	},max;
//也可以直接写成 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},max;   对齐好看些
	int *p=a[0],*q;//将指针变量p当作列指针
	max=a[0][0];
	for(int i=0;i<3;i++)//输出二维数组
	{                   //标准C语言i和j不能定义在for循环后面的括号中,必须定义在前面
	                    //C++可以将循环变量i定义在for循环后面的括号中
		for(int j=0;j<4;j++)
		{
			printf("%3d",*(*(a+i)+j));
		}
		putchar('\n');
	}
	for(; p < a[0]+12; p++)
	{
		if(max<*p)
		{
			max=*p;
			q=p;
		}
	}
	printf("The max is %d\n",max);
	printf("row:%d\ncol:%d\n",(q-a[0])/4+1,(q-a[0])%4+1);//加1是因为行和列都是从0开始的
	//不能用 q-a  因为q是列指针,a是行指针,必须用q-a[0]进行指针运算
	return 0;
}

在这里插入图片描述

下一篇文章:指针与字符串+指针数组+二级指针

指针与字符串+指针数组+二级指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackey_Song_Odd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值