我必须定义一个24位的数据类型。我使用char[3]来表示类型。我可以类型定义字符[3]类型24?我在一个代码示例中尝试了它。我输入typedef char[3] type24;在我的头文件中。编译器并没有抱怨。但是当我在我的C文件中定义一个函数void foo(type24 val){}时,它确实抱怨了。我想能够定义函数,如type24_to_int32(type24 val)而不是type24_to_int32(char值[3])。
当前回答
你想要的
typedef char type24[3];
C类型声明在这方面很奇怪。如果要声明该类型的变量,则将类型放置在变量名所在的位置。
其他回答
你想要的
typedef char type24[3];
C类型声明在这方面很奇怪。如果要声明该类型的变量,则将类型放置在变量名所在的位置。
基于已接受的答案,多维数组类型(即固定长度数组的固定长度数组)不能声明
typedef char[M] T[N]; // wrong!
相反,中间1D数组类型可以声明并在接受的答案中使用:
typedef char T_t[M];
typedef T_t T[N];
或者,T可以在一个单独的(可以说是令人困惑的)语句中声明:
typedef char T[N][M];
它定义了一种类型的N个数组的M字符(注意顺序,这里)。
类型定义为
typedef char type24[3];
然而,这可能是一个非常糟糕的主意,因为结果类型是一个数组类型,但它的用户不会看到它是一个数组类型。如果作为函数参数使用,它将通过引用传递,而不是通过值,并且它的sizeof将是错误的。
一个更好的解决办法是
typedef struct type24 { char x[3]; } type24;
您可能还希望使用unsigned char而不是char,因为后者具有实现定义的签名性。
下面是一个简短的例子,说明为什么typedef数组会令人困惑地不一致。其他答案提供了一种变通办法。
#include <stdio.h>
typedef char type24[3];
int func(type24 a) {
type24 b;
printf("sizeof(a) is %zu\n",sizeof(a));
printf("sizeof(b) is %zu\n",sizeof(b));
return 0;
}
int main(void) {
type24 a;
return func(a);
}
这会产生输出
sizeof(a) is 8
sizeof(b) is 3
因为type24作为参数是一个指针。(在C语言中,数组总是作为指针传递。)谢天谢地,gcc8编译器将在默认情况下发出警告。
在C语言中,数组不能按值作为函数参数传递。
你可以把数组放在一个结构体中:
typedef struct type24 {
char byte[3];
} type24;
然后按值传递,当然这样用x.byte[0]代替x[0]就不太方便了。
你的函数type24_to_int32(char值[3])实际上是通过指针传递的,而不是通过值。它完全等价于type24_to_int32(char *value), 3被忽略。
如果你很高兴通过指针,你可以坚持数组,并做:
type24_to_int32(const type24 *value);
这将传递一个指向数组的指针,而不是指向第一个元素的指针,所以你可以这样使用它:
(*value)[0]
我不确定这真的是一个增益,因为如果你不小心写了值[1],那么就会发生一些愚蠢的事情。
推荐文章
- 开关语句:必须默认为最后一种情况?
- 逗号运算符是做什么的?
- 如何在Java中将int[]转换为Integer[] ?
- 在内存的哪里我的变量存储在C?
- 通过SSH使用Eclipse完成远程项目
- int的最大值
- c++中有最大数组长度限制吗?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 如何在c#中连接列表?
- 在JavaScript中根据键值查找和删除数组中的对象
- C“int”的大小是2字节还是4字节?
- 如何确定一个数组是否包含另一个数组的所有元素
- 给定一个数字数组,返回所有其他数字的乘积的数组(不除法)
- 多维数组如何在内存中格式化?
- printf()和puts()在C语言中的区别是什么?