在C语言中的输入/输出变量

3
假设您有一个在C中初始化指针的函数:
void initialize(Pointer * p);
我会说参数p是[out]参数。
然后我们有一个函数获取p并操纵它。
void manipulate(Pointer * p)
现在我怀疑p是[out]还是[in/out]。
我会说[out],因为我们只是操纵它。 我会说[in/out],因为传入的内容已经被初始化了。
我想知道哪个是正确的?
5个回答

2

声明中没有任何迹象表明这一点。唯一真正的确定是函数内部的代码。

在更现代的实现中,const 关键字可用于指示只读参数:

void manipulate(const Pointer * p)

这意味着函数内部无法给*p赋值,因此它是只读(或in)类型。但是,如果缺少const,它仍然可以是只读的。

1

标准C语言中没有直接的输入/输出概念。但是您可以通过定义自己的宏来实现。

实际上,所有参数传递都是通过仅有的两种方法完成的。

1. pass by value
2. pass by address

而且你可以自行决定如何操作。 如果你不想修改传入的参数,那么请使用const


1
如果Pointer类型本身不是一个实际的指针,比如typedef int *Pointer,那么initialize函数就不能为参数分配内存。
在这种情况下,您必须将指针作为引用传递,即必须传递指针的地址,这意味着函数应该以指向指针的指针作为参数。
void initialize(Pointer **p)
{
    *p = malloc(sizeof(Pointer));
    ...
}

称为

Pointer *p;
initialize(&p);

1

两者都不完全正确。

您正在传递一个函数指针。因此,它可以被视为输入,因为您传递了指针的。另外,它也可以被视为输出,因为您可能会更改其指向的内容。

所以我不会采用这个输入输出理论。我会将其仅视为指针本身 :)


0

例子1

char buf[256];

void manipulate(char * p)
{
    strcpy(p,"Just test string");
}

int main()
{
    manipulate(buf);
    printf("%s\n",buf);
}

在上面的例子中,buf字符串被初始化为静态缓冲内存。这里的manipulate函数将会把一条消息复制到缓冲内存中。 例子2
char *buf;

void initialize(char **p)
{
    *p = malloc(256*sizeof(char));
}

void manipulate(char * p)
{
    strcpy(p,"Just test string");
}

int main()
{
    initialize(&buf)
    manipulate(buf);
    printf("%s\n",buf);
}

在第二个例子中,buf是一个指向未在定义中初始化的字符串的指针。这里的initialize函数将会初始化缓冲区,这就是为什么我们使用了char **p,这意味着函数将初始化指针的地址。如果我们像在函数manipulate()中所做的那样传递带有*p的变量,这意味着我们只能更改指针p所指向的内存的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接