#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类型