您如何判断一个变量是二维数组、指针数组还是char类型的双指针?
有一种方法可以区分类型。
请注意,“2D数组”不是一种类型,更像是类型的分类。
“char类型的双指针”可以被认为是类型
char **
。
将对象的地址传递给
_Generic()
。
#define xtype(X) _Generic((&X), \
char (*)[4][4]: "char [4][4]", \
char *(*)[4] : "char *[4]", \
char *** : "char **", \
char (*)[4] : "char [4]", \
char ** : "char *", \
char * : "char", \
default : "?" \
)
int main(void) {
char a[4][4];
char *b[4];
char **c;
puts(xtype(a));
puts(xtype(b));
puts(xtype(c));
puts(xtype(a[0]));
puts(xtype(b[0]));
puts(xtype(c[0]));
puts(xtype(a[0][0]));
puts(xtype(b[0][0]));
puts(xtype(c[0][0]));
}
输出
char [4][4]
char *[4]
char **
char [4]
char *
char *
char
char
char
_Generic()
是 C 语言中一个很有用的扩展,但其中的细节和正确应用仍具有挑战性。我希望上述内容能让楼主至少部分地区分对象。
有趣的是,我能够使用以下更通用的 _Generic
在 a,b,c
中实现平等的区分。我对 _Generic
的某些方面持谨慎态度,因为我怀疑这可能涉及到实现定义行为。
#define xtype(X) _Generic((&X), \
char
_Generic()
- chux - Reinstate Monicaa
是一个二维数组,b
是一个包含4个指向字符的指针的数组,c
是一个指向指针的指针。它们都是不同的且互相独立。但是,没有任何“测试”可以区分这三者。你需要跟踪你所拥有的类型,并正确地传递和返回所需的类型。如果使用C11,你可以采纳chux正确的建议,否则就由你自己决定。 - David C. Rankin