C语言函数返回指针初始化疑问:多级指针类型匹配困惑
#include <stdlib.h> #include <stdio.h> #include <string.h> int *(*FF(int T[],int k))[2]; int main(){ int TAB[4][6]; int *(*(*a_1)(int [], int))[2]=FF+1; int *(*a_2)[2]=FF(TAB[1],6)+2; int **a_3=*FF(*TAB,0); int *a_4=**FF(*TAB,0); return 0; }
问题解答
先明确FF的返回类型:int *(*FF(...))[2]表示FF返回的是指向包含2个int*元素的数组的指针,咱们拆解两个疑问:
为什么a_3 = *FF(*TAB,0)是二级指针?
FF(*TAB,0)的返回值是int *(*)[2]类型,也就是指向int*[2]数组的指针。- 对这个指针解引用
*FF(...),得到的是int*[2]类型的数组本身。但在C语言中,数组名出现在表达式里(除了sizeof、取地址&等少数场景),会自动转换成指向数组第一个元素的指针。 - 这个数组的元素是
int*,所以指向第一个元素的指针就是int**类型,刚好匹配a_3的二级指针类型。你以为解引用会直接拿到首个int*,但实际上数组先被转换成了指向它的指针,所以结果是二级指针。
为什么a_4 = **FF(*TAB,0)是一级指针?
- 第一层解引用
*FF(...)得到数组后转成int**(二级指针),第二层解引用**FF(...)就是取这个二级指针指向的内容——也就是数组的第一个元素,而数组元素本身是int*类型,所以结果是一级指针,不是int值。
内容的提问来源于stack exchange,提问作者user24998657
相关产品推荐
相关产品推荐

