当先锋百科网

首页 1 2 3 4 5 6 7
#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);

}