C函数中的参数传递
我有一个用C写的函数C函数中的参数传递,c,function,parameter-passing,C,Function,Parameter Passing,我有一个用C写的函数 FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1); BeginKey是函数调用之前的一个指针,我没有启动它,比如 BeginKey = NULL; 在FindBeginKey()函数中,我将BeginKey分配给另一个指针,并尝试在函数中打印出BeginKey的当前地址,它工作正常。 但是当代码从函数返回时,我再次尝试打印出BeginKey的地址,它显示0x0 为什么会发生这种情况?如果我想保留函数中分配
FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);
BeginKey是函数调用之前的一个指针,我没有启动它,比如
BeginKey = NULL;
在FindBeginKey()
函数中,我将BeginKey
分配给另一个指针,并尝试在函数中打印出BeginKey
的当前地址,它工作正常。
但是当代码从函数返回时,我再次尝试打印出BeginKey
的地址,它显示0x0
为什么会发生这种情况?如果我想保留函数中分配的地址,我该怎么办?据我所知,您调用函数的方式如下:
FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);
但是,当您尝试在BeginKey地址写入时,基本上是传入指向0x00的指针。相反,您需要向BeginKey传递一个指针
FindBeginKey(KeyListTraverser, BeginPage, &BeginKey, key1);
如果这不是您的意思,那么如果您发布了一个代码示例,肯定会有所帮助。要从函数中传递值,您必须通过引用传递,而不是像C函数通常那样通过值传递。为此,请将参数设置为指向要传递的类型的指针。然后使用
和(地址操作数)将值传递到调用中
e、 g
并称之为:
FindFoo(&BeginKey);
在函数中:
*BeginKey = 0xDEADC0DE;
如果要修改子例程中的参数,应该传递要修改的对象的指针
void subroutine(int* x) {
*x = 5; // will modify the variable which x points to
x = 5; // INVALID! x is a pointer, not an integer
}
我不知道现在所有的C参数传递规则是什么,所以这个答案可能有点过时了。根据构建这些应用程序调用的应用程序和库的常见做法,C函数的返回将包含状态,因此函数的调用方可以根据状态代码做出决定
如果您希望函数修改其输入参数,您可以通过引用&my\u val
传递这些参数,其中int my\u val代码>。您的函数必须像这样取消对my_val的引用才能获得其值
此外,出于性能原因,和地址(通过引用)可能更可取,这样应用程序就不会麻烦将参数的值复制到局部变量中。该prolog代码由编译器生成。单参数、char、int等都是相当直接的
<>我习惯C++,在C++中引用引用不需要取消引用。编译器的代码为您解决了这一问题
但是,可以考虑将指针传递给结构
struct my_struct
{
int iType;
char szName[100];
} struct1;
struct my_struct *pStruct1 = &struct1;
如果结构包含在初始化时填写一次,然后在整个程序中引用的查找数据,则通过valuepStruct1
传递指向该结构的指针。如果您正在编写一个函数来填充该结构或修改已经存在的数据,那么请按值传递指向该结构的指针。您仍然可以更改结构指针指向的内容
另一方面,如果您正在编写一个函数来为指针分配内存,那么请传递指针的地址(指向指针的指针)&pStruct1
,这样您就可以使指针指向正确的内存。您能给我们展示一下FindBeginKey
的类型以及您传入的所有参数的类型吗?
struct my_struct
{
int iType;
char szName[100];
} struct1;
struct my_struct *pStruct1 = &struct1;