0

我有很多功能,例如:

void write(char* param, int len)
{
    //
}

而且我注意到我几乎从不使用&运算符作为参数。当我传递一个数组时:

char in[20];
write(in, 20);

我不需要它,但是当我传递一个值时:

write(5, 1);

我似乎不需要它,当我传递一个指针时:

char* in = malloc(20);
write(in, 20);

我也不需要。那么在哪些情况下我实际上需要调用:

write(&in, 1);

因为我很困惑 :D

4

5 回答 5

4

你确定你的第二个案例?它不适合我,应该是

char in = 5;
write(&in, 1);
于 2013-01-30T17:38:10.557 回答
2

何时将值隐式转换为指针?

实际上,整数类型可以由编译器隐式转换为指针。理论上,这是非法的,接受它的编译器通常会发出警告:

example.c:2:6: warning: incompatible integer to pointer conversion initializing
               'void *' with an expression of type 'int'

在你上面的例子中:

char in = 5;
write(in, 20);

char是一个整数类型,所以如果你的编译器允许它,它可能会被隐式转换为指针类型,尽管它不是 C 标准的一部分并且完全是编译器特定的。

请注意,标准允许使用强制转换将整数类型转换为指针类型,尽管结果是实现定义的:

char in = 5;
write((char *)in, 20);

唯一允许的隐式转换情况是表示空指针的整数常量0

write(0, 20);    // allowed

请注意,整数常量本身是允许的,但具有值的整数类型的变量0则不允许:

char in = 0;
write(in, 20);   // not allowed

至于其他人,当你传递一个指针时,你显然不需要&,因为它已经是一个指针。当您传递一个数组时,它会衰减为一个指针,因此您也不需要&那里。在这两种情况下,使用它实际上是非法的,因为您上面的函数期望 achar *并分别使用 achar **和 a char (*)[20]

于 2013-01-30T17:40:08.217 回答
1

如果您以某种方式将函数“write”的原型复制到调用此函数的文件中,如下所示。

void write(char *in, int len);

void foo(int bar){
   char in=5;
   write(in, 1);
}

您可能会收到警告。因为 in 不是指针,虽然 5 可以是地址。我猜如果你的程序编译和链接成功,它会在运行时崩溃。

于 2013-01-30T17:46:40.620 回答
1

与使用; return_type function_name(prim_data_type* param...) param 是一个指针,它指向内存中的一个地址,并且*param是该地址中的值。答案是关于你想用这个做什么param

char in[20];

说“ in ”是第一个元素的地址。所以在函数调用中:

write(in, 20);

您正在发送第一个元素的地址,因此在函数实现中,您可以通过 访问第一个元素*param,使用*(param+1)orparam[1]等​​访问第二个元素。您感到困惑的地方在这里:

char in = 5;
write(in, 1);

因为in是地址 5 (00000005),所以在函数的实现中,您正在访问那个地方,无论那里有什么值。你必须小心使用这样的。

在 malloc 操作中:

char* in = malloc(20);
write(in, 20);

in是一个指向地址(第一个元素的地址)的指针,它可以容纳 20 个 char 元素,可以占用空间。在函数中,您可以使用参数指针访问所有元素(*param是第一个元素,*(param+7)或者param[7]是第 8 个元素)

总之,当您想在另一个函数中使用主要数据类型变量(int、float、char..)时,您必须使用;

write(&in);

通过这样做,在该write函数的实现中,您可以访问该变量,更改值,*param而不会造成混淆。

注意:为了更好地理解,这里简化了一些解释。这里欢迎额外的警告。

于 2013-01-30T18:24:11.247 回答
0

在某些情况下,函数和数组会衰减为指针。函数可以衰减为指向函数的指针,数组可以衰减为指向数组第一个元素的指针。没有其他类型以这种方式运行。

这个例子:

char in = 5; 
write(in, 1);

虽然是错的。在这种情况下,您绝对需要&。你确定它是这样工作的吗?

于 2013-01-30T17:38:05.937 回答