上一篇文章:内存编址+C语言指针+指针作为函数参数+指向一维数组的指针
指向二维数组的指针+用typedef定义行指针和数组
指向二维数组的指针
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;
}