int main ()
{
void swap(int array[3][3]);
//这里用一下刚学的指针
//void f(int a[3][3]);
int a[3][3],i,j;
int (*p)[3];
/**************************
必须有个(*p) 如果是int *p[3]就是一个全是指针的数组
***************************/
p=a;//把第零行的首个元素的地址给p
printf("请给3*3的数组赋值\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
scanf("%d",(*(p+i)+j));
}
printf("输入数组为\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%2d ", *(*(p+i)+j));
}
printf("\n");
}
swap(a);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%2d ", *(*(p+i)+j));
}
printf("\n");
}
return 0;
}
void swap(int array[3][3])//参数是一个数组 调用的话 把数组名给给就好了
{
int temp,i,j;
int (*p)[3];
p=array;
for(i=0;i<3;i++)
for(j=i+1;j<3;j++)//如果j=0的话那就又换回去了
{
temp= *(*(p+i)+j);
*(*(p+i)+j)= *(*(p+j)+i);
*(*(p+j)+i)= temp;
}
printf("swap over ^_^\n");
}
/*************
int *p[4]; //定义一个指针数组(个人理解 偏意词语偏向后面的词),该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续来再定义了。
int (*p)[4]; //定义一个数组指针,该指针源指向含4个元素的一维数组(数组中每个元素是int型)。
区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。
int p[n]; 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int说明这是一个整型指针数组。
int (*p)[n]; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。
原文博客:https://blog.csdn.net/weixin_44720916/article/details/105621896
***************************/
/******************************
指针上加减1等于他存的地址加减他存的一个单位元素所占的字节长度
*取值操作符,&取址操作符
********************************
说明:
现有一个一维数组,那么a就是首元素的地址,现在有一个
二位数组,那么 a指的是第0行的首元素的地址(a可以看成指针
但是数组字母虽然表示指针但是他是不能修改的左值即不能执行++运算等),
*********************************
(可以把二维数组看成一维数组的数组),再简单来看假如有数组int a[3][3]
那么 可以看成一个一维数组b[3]有三个元素,一个元素长(int 4字节)4*3字节
那么a+1()指的是第1行的元素第0个元素地址&a[1][0]
a+2()指的是第2行的第0个元素地址 &a[2][0]
a[1]+1那指的是第行第一列的元素地址&a[1][1]
a[1]等价于*(a+1)
*************************
信息来源于博客,以及个人理解
https://blog.csdn.net/zj490044512/article/details/86353764
*******************************
那么再来说明指针数组
int(指向数组类型) *p[二维数组的列数(一行的长度)]
在深入一点就是可以分解成多少个一维数组,该一维数组的长度
*(*(p+i)+j)指的是第i行第j列的元素的值
******************************/
有误请评论