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; }
关键说明
- 参数类型匹配:直接传指针数组名
ptrArray,它会隐式转换为指向第一个元素的指针(int**),和函数参数类型匹配。 - 解引用获取值:
tab[i]是int*类型的指针,必须用*tab[i]才能拿到它指向的实际数值。 - 修正循环边界:原
size=5对应数组索引0-5,逆序要从i=5开始到i=0,否则会漏掉第一个元素。
内容的提问来源于stack exchange,提问作者7Ver7dict7
相关产品推荐
相关产品推荐

