当函数需要指针时传递一个常量整数

Fal*_*rri 5 c pointers casting

将常量整数值传递给需要指针的函数的最佳/最经典的方法是什么?

例如,write功能

write (int filedes, const void *buffer, size_t size);
Run Code Online (Sandbox Code Playgroud)

假设我只想写一个字节(1),我会这样想:

write (fd, 1, 1);
Run Code Online (Sandbox Code Playgroud)

但我显然得到了警告

warning: passing argument 2 of 'write' makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)

我知道我能做到

int i = 1;
write (fd, &i, 1);
Run Code Online (Sandbox Code Playgroud)

但这是必要的吗?在不需要声明/初始化新变量的情况下,最正确的方法是什么?

AnT*_*AnT 10

在C89/90中,如果不声明新变量,通常不能这样做.关于C中指针的事情是它们总是指向左值.左值是在记忆中有位置的东西.因此,为了向函数提供正确的参数,您需要在内存中具有位置的东西.这通常需要一个定义,即一个对象,一个变量.C中的常量不是左值,因此您不能在那里使用常量.常量和变量之间的某些东西是文字.C89/90只有一种文字:字符串文字.字符串文字是左值,但不是变量.因此,您可以使用字符串文字作为第二个参数write.

在C99中,字面意思的概念超出了字符串文字.在C99中,您还可以将复合文字用于此目的,这也恰好是左值.在您的示例中,您可以将您的函数称为

write(fd, (char[]) { 1 }, 1)
Run Code Online (Sandbox Code Playgroud)

但此功能仅适用于C99.

  • 尼斯.要说明所描述的C90解决方案:`write(fd,"\ x1",1);`.我有时可能会使用它; 我不确定我是否对此感到高兴. (2认同)