You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何将指针数组作为函数参数传递并正确访问?

问题:指针数组作为函数参数传递的问题

我想把指针数组作为函数参数传递,实现将数组元素从后往前排序,但遇到了问题。main函数里能正常打印数组内容,但传递到函数后打印的是乱值,像是指针地址。

#include <stdio.h>

void ft_rev_int_tab(int *tab, int size){

    printf("%d\n", tab[0]);
    printf("%d\n", tab[1]);
    printf("%d\n", tab[2]);
    printf("%d\n", tab[3]);
    printf("%d\n", tab[4]);
    printf("%d\n", tab[5]);

    for(int i = size; i>0; i--){   // <- 我想要实现的逆序打印
        printf("%d", tab[i]);      // 这里有问题
    }
}
int main(){

    int a = 1, b = 2, c = 3, d = 4 , e = 5, f = 6, size = 5;
    int *ptrArray[6] = {&a, &b, &c , &d, &e, &f};
    // 这里用printf("%d\n", *ptrArray[索引]);能正常打印
    printf("%d!!!\n", *ptrArray[5]);
    ft_rev_int_tab(*ptrArray, size);

    return 0;
}

输出结果:
6!!! // -> 来自main函数
1
2
6
1
0
-167881014 // -> 来自ft_rev_int_tab函数(每行一个数字)


问题根源

你定义的ptrArray是指针数组(int *ptrArray[6]),每个元素都是指向int的指针。但调用函数时传的*ptrArray等价于ptrArray[0],也就是指向变量a的单个指针。函数ft_rev_int_tab把这个指针当成普通int数组的首地址来访问,而a后面的内存区域并非你定义的变量,所以打印出乱值。

正确解决方法

要传递指针数组给函数,函数参数类型应该是int **tab(或int *tab[],二者等价)——因为指针数组的每个元素是int*,数组本身退化为指针后就是int**类型。

修改后的代码:

#include <stdio.h>

// 修改参数类型为int**
void ft_rev_int_tab(int **tab, int size){
    // 打印每个指针指向的值,需要解引用
    for(int i = 0; i < size + 1; i++){
        printf("%d\n", *tab[i]);
    }

    // 逆序打印(修正循环边界,覆盖0-5所有索引)
    for(int i = size; i >= 0; i--){
        printf("%d ", *tab[i]);
    }
}
int main(){
    int a = 1, b = 2, c = 3, d = 4 , e = 5, f = 6, size = 5;
    int *ptrArray[6] = {&a, &b, &c , &d, &e, &f};
    
    printf("%d!!!\n", *ptrArray[5]);
    // 直接传递指针数组名,它会退化为int**类型
    ft_rev_int_tab(ptrArray, size);

    return 0;
}

关键说明

  1. 参数类型匹配:直接传指针数组名ptrArray,它会隐式转换为指向第一个元素的指针(int**),和函数参数类型匹配。
  2. 解引用获取值:tab[i]是int*类型的指针,必须用*tab[i]才能拿到它指向的实际数值。
  3. 修正循环边界:原size=5对应数组索引0-5,逆序要从i=5开始到i=0,否则会漏掉第一个元素。

内容的提问来源于stack exchange,提问作者7Ver7dict7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:37:31