#include<stdio.h>
//数组指针是一种指针--指向数组
//
//整形指针--指向整型的指针
//字符指针--指向字符的指针
//int main()
//{
// int a = 10;
// int* pa = &a;//整形指针
// char ch = 'w';
// char* pb = &ch;//字符指针
// int arr[10] = { 1,2,3,4,5 };
// arr;//是错误的,因为数组名是首元素地址---arr[0]
// int(* pc)[10] = &arr;//取出的是数组的地址 arr指向的是数组 此时的pc是数组指针
// double *d[5];//d是数组名,数组5个元素,double说明每个元素是double型
// double*(*pd)[5] = &d;//(*pd)说明pd是指针,指向数组,数组5个元素,double说明每个元素是double型
// return 0;
//}
//
//
//int main()
//{
// int arr[10] = { 0 };//结果相同,但是意义不同
// printf("%p\n", arr);//000000C9F97CF6D8数组名表示首元素地址
// printf("%p\n", &arr);//000000C9F97CF6D8取出的是数组的地址 若想存储在p中,存储方式不同
// int* p1 = arr;
// int(*p2)[10] = &arr;//p1 p2结果相同,但是意义不同
// printf("%p\n", p1); //000000C9F97CF6D8
// printf("%p\n", p2);//000000C9F97CF6D8
// printf("%p\n", p1+1);//000000C9F97CF6DC
// //+1跳过的是一个元素的地址(4)(p2指向的是首元素的地址)
// printf("%p\n", p2+1);//000000C9F97CF700
// //+1跳过的是整个数组(40)(p2指向的是数组地址)
// return 0;
//}
//数组名是首元素地址
//但是有两个例外:
//1:sizeof(数组名)---数组名表示整个数组,计算的是整个数组大小,单位是字节
//2:&数组名---数组名表示整个数组,取出的是整个数组的地址
//打括号()就是数组地址,不打括号就是指针数组
//
//两种不同思路和方法:
//int main()//解引用法
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int* p1 = arr;//取出的是首元素地址,此时(方法一)使用for循环打印数组比较方便,如下
// int i = 1;
// for (i = 0; i < 10; i++)
// {
// printf("%d ", *p1 + i);//*p1是解引用,取出里面的值 &arr是打印地址
// }
// return 0;
//}
//int main()//指针数组法
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int (*p2)[10] = &arr;//取出的是整个数组地址,此时(方法二)使用for循环打印数组比较复杂,如下
// int i = 1;//p2是指针,指向的是数组,数组是10个元素,每个元素是int型
// for (i = 0; i < 10; i++)//(*pa)是解引用找到整个数组,即数组名,即首元素地址
// { //(*pa)+i表示首元素地址逐个向后+1
// printf("%d ", *((*p2)+i));//*((*pa)+i)表示首元素地址逐个向后+1并解引用,*表示解引用
// }
// return 0;
//}
//第一个思路
//void print1(int arr[3][5], int r, int c)//用数组arr接收,[3][5]表示数组行列数,用r,c表示,无返回类型
//{
// int i = 0;
// int j = 0;
// for (i = 0; i < r; i++)
// {
// for (j = 0; j < c; j++)
// {
// printf("%d ",arr[i][j]);
//
// }
// printf("\n");
// }
//}
第二种思路方法,,,参数部分p是数组指针,指向数组某一行
//void print2(int(*p)[5], int m, int n)//(*p)是解引用arr,表示一行地址,,[5]是首元素地址,数量5
//{
// int i = 0;
// int j = 0;
// for (i = 0; i < m; i++)
// {
// for (j = 0; j < n; j++)
// {
// printf("%d ", *(*(p + i) + j));//*(p+i)表示某一行第一个元素地址,*(p+i)+j表示该行下标为j的地址
// //*(*(p+i)+j),解引用,就是第i行,下标为j的元素
// }
// printf("\n");
// }
//}
//int main()
//{
// int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };//分别可理解为arr[0],arr[1],arr[2]
// //写两个不同思路的函数来表示
// print1(arr,3,5);//自己构建的打印函数
// printf("\n");//将两种思路单纯的分隔开,无实际意义
// print2(arr, 3, 5);//arr数组名是首元素地址,二维数组首元素是第一行所有元素!!!
// return 0;
//}
//int(*parr2)[10];//数组指针,该指针能够指向一个数组,数组10个元素,每个元素类型是int
//int(*parr3[10])[5]; parr3是一个存储数组指针的数组,该数组能够存放10个数组指针,这每个数组指针
//能够指向一个数组,数组5个元素,每个元素是int类型