二维数组 – 数组指针
#include <stdio.h>
int main(int argc, char *argv[])
{
// 定义:数组指针
int a[3][5]; // 定义了一个3行5列的一个二维数组
int(*p)[5]; // 定义了一个数组指针变量p,p+1跳一个有5个元素的整型数组
printf("a=%p\n",a); // 第0行的行地址 a=0060FE60
printf("a+1=%p\n",a+1); // 第1行的行地址,a和a+1差20个字节 a+1=0060FE74
p = a;
printf("p=%p\n",p); // p=0060FE60
printf("p+1=%p\n",p+1); // p+1跳一个有5个整型元素的一维数组 p+1=0060FE74
return 0;
}
二维数组的数组名降级问题
#include <stdio.h>
int main(int argc, char *argv[])
{
// 二维数组的数组名降级问题:行指针降级为列指针
int a[3][5];
printf("a=%p\n", a); // a=0060FE64 行地址
printf("a + 1=%p\n", a+1); // a + 1=0060FE78
printf("*a = %p\n", *a); // *a = 0060FE64 *a变成了第0行第0列元素的地址
printf("(*a)+1 = %p\n", (*a) + 1); // (*a)+1 = 0060FE68 这个是第0行第1列元素的地址
printf("*a + 1 = %p\n", *a + 1); // *a + 1 = 0060FE68
printf("*a + 5 = %p\n", *a + 5); // *a + 5 = 0060FE78
return 0;
}
将二维数组的首地址传递到另一个函数里面,此时函数的形参就需要定义为数组指针
#include <stdio.h>
// 数组指针的用法
// 可以将二维数组的首地址传递到另一个函数里面,此时函数的形参就需要定义为数组指针
void fun(int(*p)[5],int x, int y)
{
p[0][1] = 101;
// *(*p +1) = 101;
// p是行指针, *p降级为列指针 , *p +1 第0个元素+1就是第1个元素, * (*p +1) 取值
}
void test2()
{
int i,j;
int a[3][5];
fun(a,3,5);
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
int main(int argc, char *argv[])
{
test2();
return 0;
}
// 4199887 101 4218912 -1 16515072
// 6356648 4198762 0 4200351 4200368
// 2008309326 0 1 16520888 97
一维数组 – 数组指针
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10];
printf("%p\n",a); // 0060FE78 9 A B C
printf("%p\n",a+1); // 0060FE7C 一维数组名字 为首元素地址 +1 跳一个整型元素
printf("%p\n", &a); // 0060FE78 9 A B C D E F 80 ... 90 ...A0 8+16+16=40个字节
printf("%p\n", &a + 1); // 0060FEA0 &a 就变成一个一维数组指针,是int (*p)[10]类型了。
return 0;
}