C语言-指针数组与数组指针

1、指针数组

对于int *p1[5];而言,因为[]的优先级要比*要高,所以p1先与[]结合,构成一个数组的定义,数组名为 p1。而int修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向int类型数据的指针,如下图所示,它是一个指针数组。
指针数组

2、数组指针

对于语句int(*p2)[5]()的优先级比[]高,*号和p2构成一个指针的定义,指针变量名为p2,而int修饰的是数组的内容,即数组的每个元素。也就是说,p2是一个指针,它指向一个包含 5 个int类型数据的数组,如下图所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
数组指针

int **findtwo(int **arr, int m, int n) {
    int **res = (int **)malloc(sizeof(int *) * 2);
    res[0] = (int *) malloc(sizeof(int) * 2);
    res[1] = (int *) malloc(sizeof(int) * 2);
    res[0][0] = arr[0][0];
    res[0][1] = arr[0][1];
    res[1][0] = arr[1][0];
    res[1][1] = arr[1][1];
    return res;
}

int main() {
    int arr[][3] = {{1, 2, 3},
                    {4, 5, 6}};
    int *p[2] = {arr[0], arr[1]};
    int **res = findtwo(p, 2, 3);
    printf("%d\n", res[0][0]);
    printf("%d\n", res[0][1]);
    printf("%d\n", res[1][0]);
    printf("%d\n", res[1][1]);
}
/*
输出:
1
2
4
5
*/

3、二维数组传递

1、实参为二维数组名,形参为二维数组

void func(int n, char str[][5]) {
    for (int i = 0; i < n; i++)
        printf("str[%d] = %s\n", i, str[i]);
}

int main() {
    char str[][5] = {"abc", "def", "ghi"};
    func(3, str);
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int arr[][2], int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d\n", arr[i][j]);
        }
    }
}

int main() {
    int arr[][2] = {{1, 2},
                    {3, 4},
                    {5, 6}};
    printStr(arr, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/

2、实参为二维数组名,形参为数组指针

void func(int n, char (*str)[5]) {
    for (int i = 0; i < n; i++)
        printf("str[%d] = %s\n", i, str[i]);
}

int main() {
    char str[][5] = {"abc", "def", "ghi"};
    func(3, str);
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int (*arr)[2], int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d\n", arr[i][j]);
        }
    }
}

int main() {
    int arr[][2] = {{1, 2},
                    {3, 4},
                    {5, 6}};
    printStr(arr, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/

3、实参为指针数组,形参为指针的指针

void func(int n, char **str) {
    for (int i = 0; i < n; i++)
        printf("str[%d] = %s\n", i, str[i]);
}

int main() {
    char str[][5] = {"abc", "def", "ghi"};
    char *p[3]={str[0], str[1], str[2]};
    func(3, p);
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int **arr, int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j=0; j<n; j++){
            printf("%d\n", arr[i][j]);
        }
    }
}

int main() {
    int arr[][2] = {{1, 2},
                    {3, 4},
                    {5, 6}};
    int *p[3]={arr[0], arr[1], arr[2]};
    printStr(p, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/

4、实参为指针数组,形参为指针数组

void printStr(char *str[], int n) {
    for (int k = 0; k < n; k++) {
        printf("%s\n", str[k]);
    }
}

int main() {
    char str[][5] = {"abc", "def", "ghi"};
    char *pstr[3] = {str[0], str[1], str[2]};
    printStr(pstr, 3);
    return 0;
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int *arr[3], int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j=0; j<n; j++){
            printf("%d\n", arr[i][j]);
        }
    }
}

int main() {
    int arr[][2] = {{1, 2},
                    {3, 4},
                    {5, 6}};
    int *p[3]={arr[0], arr[1], arr[2]};
    printStr(p, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值