二维数组传参为例了解数组指针

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//二维数组传参为例了解数组指针的使用
void print_arr1(int arr[3][5], int row, int col)    //传值调用,函数的形参直接是一个二维数组
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}
void print_arr2(int(*arr)[5], int row, int col)        //传址调用,int(*arr)[5]是一个一维数组指针,指向的是一维数组
{
    //int(*arr)[5]是一个一维数组指针,指向的数组有5个元素
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            //printf("%d ", arr[i][j]);
            printf("%d ", *(*(arr + i) + j));
            //arr[i][j]与*(*(arr + i) + j)等价:
            //arr是二维数组名,代表的是二维数组第一行的地址,那么arr + i就代表的是第i+1行的地址,*(arr + i)就是第i+1行的一维数组,如果觉得难理解,可以用一个一维数组(假设是arr1)来代替*(arr + i),arr1+j就是下标为j的元素的地址,即原代码中的*(arr + i) + j,对其解引用*(*(arr + i) + j))就得到该一维数组中的下标为j的元素。回到代码,*(arr + i)找到的是二维数组下标为i的行,最终再以*(*(arr + i) + j)找到下标为j的列,即arr[i][j]

        }
        printf("\n");
    }
}
int main()
{
    int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
    print_arr1(arr, 3, 5);
    //print_arr2(arr, 3, 5);
    //传值调用中数组名表示的是整个数组;传址调用中数组名表示的是首元素的地址,对于二维数组而言,数组名表示的二维数组第一行的地址,即等价于一个一维数组指针
    return 0;
}

猜你喜欢

转载自blog.csdn.net/libj2023/article/details/131058349
今日推荐