[英]expected unqualified-id before '{' token and expected initializer before "main"
[英]typedef error: expected unqualified-id before ')' token
typedef int (*)[4] p_array;
int main()
{
int a[3][4] = {{1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}};
p_array p = a;
return 0;
}
typedef oldTypeName newTypeName
我理解typedef
语法是这样的,所以我在我的代码中为int (*)[4]
类型定义了一个新名称,这意味着它是一个指针,指向的类型是一个长度为 4 的数组,元素类型为数组是整数。 我认为我的代码在逻辑上是正确的。 但它不能被编译器接受。 我应该如何理解typedef
的语法。
定义 typedef 名称类似于声明变量。
例如,如果你想声明一个指向 int[4] 类型数组的指针,你可以写
int ( *p_array )[4];
或者
int ( *p_array )[4] = a;
其中a
表示一个数组,类型为int[3][4]
。
因此,您可以为此类指针的类型声明一个别名,例如
typedef int (*p_array )[4];
或者
int typedef (*p_array )[4];
或者一开始你可以为数组类型int[4]
引入一个别名,比如
typedef int Array[4];
然后使用此别名为指向此类数组的指针引入别名
typedef Array *p_array;
现在你可以写
p_array p;
或者
p_array p = a;
这是一个演示程序。
#include <stdio.h>
typedef int Array[4];
Array typedef *p_array;
int main(void)
{
Array a[3] = {{1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}};
p_array p = a;
for ( ; p != a + 3; ++p )
{
for ( int *q = *p; q!= *p + 4; ++q )
{
printf( "%d ", *q );
}
putchar( '\n' );
}
return 0;
}
它的输出是
1 1 1 1
2 2 2 2
3 3 3 3
像这样
typedef int (*p_array)[4];
你对 typedef 语法的理解合乎逻辑但不正确。
正确的理解是考虑变量声明(在您的情况下为int (*p_array)[4];
)并将关键字typedef
放在其前面。 Typedef 将变量声明转换为类型声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.