#include <stdio.h>
#define FUNCTION_START() printf("-----------%s(%d)--start----------\n",__FUNCTION__, __LINE__)
#define FUNCTION_END() printf("-----------%s(%d)--end------------\n",__FUNCTION__, __LINE__)
/**************************************************************************************
* 实参 形参
* int c[8][10] 二维数组、数组指针
* int (*array_to_point)[3] 二维数组、数组指针
* int *point_to_array[3] 指针数组、二级指针
* int **point_to_point 指针数组、二级指针
* ************************************************************************************/
int pointToPoint(int **point, int row, int col){
FUNCTION_START();
int i = 0;
int j = 0;
printf("point[0]=%p,point[1]=%p,point[2]=%p\n",point[0],point[1],point[2]);
for(i = 0; i < row; i ++){
for(j = 0; j < col; j ++){
printf("&point[%d][%d] = %p\n",i,j,&point[i][j]);
printf("point[%d][%d] = %d\n",i, j, point[i][j]);
}
}
FUNCTION_END();
}
int pointToArray(int *point[3], int row, int col){
FUNCTION_START();
int i = 0;
int j = 0;
printf("point[0]=%p,point[1]=%p,point[2]=%p\n",point[0],point[1],point[2]);
for(i = 0; i < row; i ++){
for(j = 0; j < col; j ++){
printf("&point[%d][%d] = %p\n",i,j,&point[i][j]);
printf("point[%d][%d] = %d\n",i, j, point[i][j]);
}
}
FUNCTION_END();
}
int arrayToPoint(int (*point)[3], int row, int col){
FUNCTION_START();
int i = 0;
int j = 0;
printf("point[0]=%p,point[1]=%p,point[2]=%p\n",point[0],point[1],point[2]);
for(i = 0; i < row; i ++){
for(j = 0; j < col; j ++){
printf("&point[%d][%d] = %p\n",i,j,&point[i][j]);
printf("point[%d][%d] = %d\n",i, j, point[i][j]);
}
}
FUNCTION_END();
}
void main(){
int **point_to_point; //二级指针
int (*array_to_point)[3]; //数组指针,指向数组的指针
int *point_to_array[3]; //指针数组,数组的每个元素是指针
int *point;
int i = 0;
int j = 0;
/* 二维数组申请的还是一段连续的地址 array+1 为 array[1]的地址*/
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
/* 可以使用一级指针来指向二维数组,array代表array[0][0]的地址,可以依次向后偏移4个字节来获取后面的一个值 */
// int *p = (int *)array;
// printf("array=%p,array[1][1]=%d,&array[1][1]=%p,p=%p,p+4=%d,*(p+4)=%d\n",array,array[1][1],&array[1][1],p,(p+4),*(p+4));
point = (int *)array;
for(i = 0; i < 9; i ++){
printf("point[%d] = %d\n", i, point[i]);
}
point_to_point = (int **)array;
/* 此时 point_to_point 指向的是 array[0][0] 的地址,point_to_point+1 指向的是array[0][2] 的地址
(sizeof(point_to_point)=8,占两个int的大小,因此 point_to_point+1 相当于向后偏移 8 个字节),
此时取 *point_to_point 与 *(point_to_point+1) 的值,相当于取 array[0][0] 与 array[0][2]的值,
而不是指向array[0][0] 与 array[0][2]的地址,因此取**point_to_point时会出现错误 */
printf("sizeof(point_to_point)=%d,point_to_point=%p,array=%p,(point_to_point+1)=%p,*point_to_point=%p,*(array)=%p,*(point_to_point+1)=%p\n",
sizeof(point_to_point),point_to_point,array,(point_to_point+1),*point_to_point,*array,*(point_to_point+1));
//pointToPoint(point_to_point,3,3); //point_to_point[0][0]会出现段错误
array_to_point = array; //数组指针,指向数组的指针,相当于二维数组
/* 数组指针可理解为一个指向一维数组的一级指针,他指向的是一个数组,也就相当于二维数组内部的一维数组 */
arrayToPoint(array_to_point, 3, 3);
arrayToPoint(array, 3, 3);
for(i = 0; i < 3; i ++){
point_to_array[i] = array[i];
}
point_to_point = point_to_array;
/* 二级指针可以等效为指针数组,指针数组可理解为一个数组,内部元素为指针,
二级指针为一个指向指针的指针,也就相当于 *(*p), 可将内层的指针指向为一维数组,
也就是 (int *)*p = point_to_array, 外层的指针为数组内的值,也就是 p = array[0] */
pointToArray(point_to_array, 3, 3);
pointToPoint(point_to_point, 3, 3);
pointToArray(point_to_point, 3, 3);
pointToPoint(point_to_array, 3, 3);
}