我必须定义一个24位的数据类型。我使用char[3]来表示类型。我可以类型定义字符[3]类型24?我在一个代码示例中尝试了它。我输入typedef char[3] type24;在我的头文件中。编译器并没有抱怨。但是当我在我的C文件中定义一个函数void foo(type24 val){}时,它确实抱怨了。我想能够定义函数,如type24_to_int32(type24 val)而不是type24_to_int32(char值[3])。
当前回答
要正确地将数组类型用作函数实参或模板形参,请创建一个struct而不是typedef,然后在结构中添加一个操作符[],这样您就可以保持数组类函数,如下所示:
typedef struct type24 {
char& operator[](int i) { return byte[i]; }
char byte[3];
} type24;
type24 x;
x[2] = 'r';
char c = x[2];
其他回答
在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],那么就会发生一些愚蠢的事情。
类型定义为
typedef char type24[3];
然而,这可能是一个非常糟糕的主意,因为结果类型是一个数组类型,但它的用户不会看到它是一个数组类型。如果作为函数参数使用,它将通过引用传递,而不是通过值,并且它的sizeof将是错误的。
一个更好的解决办法是
typedef struct type24 { char x[3]; } type24;
您可能还希望使用unsigned char而不是char,因为后者具有实现定义的签名性。
你想要的
typedef char type24[3];
C类型声明在这方面很奇怪。如果要声明该类型的变量,则将类型放置在变量名所在的位置。
从R . .的回答:
然而,这可能是一个非常糟糕的主意,因为结果类型 是数组类型,但它的用户不会看到它是数组类型。 如果用作函数参数,它将通过引用传递,而不是通过 Value,那么它的sizeof就会是错误的。
没有看到它是一个数组的用户很可能会写这样的东西(这是失败的):
#include <stdio.h>
typedef int twoInts[2];
void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);
int main () {
twoInts a;
a[0] = 0;
a[1] = 1;
print(&a);
intermediate(a);
return 0;
}
void intermediate(twoInts b) {
print(&b);
}
void print(twoInts *c){
printf("%d\n%d\n", (*c)[0], (*c)[1]);
}
它将编译以下警告:
In function ‘intermediate’:
warning: passing argument 1 of ‘print’ from incompatible pointer type [enabled by default]
print(&b);
^
note: expected ‘int (*)[2]’ but argument is of type ‘int **’
void print(twoInts *twoIntsPtr);
^
并产生以下输出:
0
1
-453308976
32767
要正确地将数组类型用作函数实参或模板形参,请创建一个struct而不是typedef,然后在结构中添加一个操作符[],这样您就可以保持数组类函数,如下所示:
typedef struct type24 {
char& operator[](int i) { return byte[i]; }
char byte[3];
} type24;
type24 x;
x[2] = 'r';
char c = x[2];
推荐文章
- 如何读一个文本文件到一个列表或数组与Python
- 如何在Python中将十六进制字符串转换为字节?
- C多行宏:do/while(0) vs作用域块
- 与push()相反;
- 用“+”(数组联合运算符)合并两个数组如何工作?
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- 使arrayList.toArray()返回更具体的类型
- 如何从对象数组中通过对象属性找到条目?
- 如何从关联数组中删除键及其值?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- main()中的Return语句vs exit()
- 如果不是内存地址,C指针到底是什么?