如何转换变量地址并将其传递给 C 中的函数
How to cast and pass the address of a variable to a function in C
假设我有一个 int
类型的变量,我想将其作为参数传递给 C 函数。这个函数期望参数是一个long long
类型的指针。是否可以像这样转换这个变量然后将它的地址传递给函数并且不在程序中使用其他变量:
int val;
val = 10;
my_function((long long) &val);
void my_function(long long *parameter)
{
// do some operations with 'parameter'
}
不确定这段代码是否有隐藏效果。
没有。您必须传递正确的指针类型。
long long
是 8 个字节(可能),int
是 4 个字节(可能),如果你试图假装一个 int
是一个 long long
,当代码实际上使用了它将访问 int
的指针加上它旁边的另外 4 个字节,这会把事情搞砸。
您必须实际使用 long long
变量:
long long llval = val;
my_function(&llval);
val = llval; // if needed
强制转换运算符产生强制转换的标量对象的值。您可能不会取值的地址。您需要引入一个中间变量,例如
int val;
val = 10;
long long tmp = val;
my_function( &tmp );
但是,如果您尝试这样做,那么您的程序设计似乎存在缺陷。例如,为什么变量 val
最初没有声明为 long long 类型?函数声明意味着它通过引用接受对象,并且传递的对象将在函数内更改,因为参数声明时没有限定符 const。因此,要么必须将变量 val 声明为 long long 类型,要么引入另一个函数,该函数将通过引用接受 int 类型的对象。
正常情况
在正常情况下,my_function
对 parameter
指向的 long long
进行操作。那么一定有一个long long
指向parameter
。您必须向函数提供 long long
(或 C 2018 6.5 7 中的别名规则允许的对象)或至少提供函数可以创建一个的内存 space。
有一种方法可以在不创建额外变量的情况下做到这一点;您可以使用复合文字在函数调用中创建 long long
:
my_function(& (long long) {val});
但是,您将无法在函数 returns 之后使用 long long
的值。函数对 long long
所做的任何更改都不会影响 val
.
异常案例
如果 my_function
不使用 parameter
作为指向 long long
的指针,尽管它声明了类型,那么您可以向它传递一些已转换为long long
。 C 标准允许这样的用途,但这通常是不适合编写的代码,您可以传递哪些指针将取决于 my_function
在做什么。
假设我有一个 int
类型的变量,我想将其作为参数传递给 C 函数。这个函数期望参数是一个long long
类型的指针。是否可以像这样转换这个变量然后将它的地址传递给函数并且不在程序中使用其他变量:
int val;
val = 10;
my_function((long long) &val);
void my_function(long long *parameter)
{
// do some operations with 'parameter'
}
不确定这段代码是否有隐藏效果。
没有。您必须传递正确的指针类型。
long long
是 8 个字节(可能),int
是 4 个字节(可能),如果你试图假装一个 int
是一个 long long
,当代码实际上使用了它将访问 int
的指针加上它旁边的另外 4 个字节,这会把事情搞砸。
您必须实际使用 long long
变量:
long long llval = val;
my_function(&llval);
val = llval; // if needed
强制转换运算符产生强制转换的标量对象的值。您可能不会取值的地址。您需要引入一个中间变量,例如
int val;
val = 10;
long long tmp = val;
my_function( &tmp );
但是,如果您尝试这样做,那么您的程序设计似乎存在缺陷。例如,为什么变量 val
最初没有声明为 long long 类型?函数声明意味着它通过引用接受对象,并且传递的对象将在函数内更改,因为参数声明时没有限定符 const。因此,要么必须将变量 val 声明为 long long 类型,要么引入另一个函数,该函数将通过引用接受 int 类型的对象。
正常情况
在正常情况下,my_function
对 parameter
指向的 long long
进行操作。那么一定有一个long long
指向parameter
。您必须向函数提供 long long
(或 C 2018 6.5 7 中的别名规则允许的对象)或至少提供函数可以创建一个的内存 space。
有一种方法可以在不创建额外变量的情况下做到这一点;您可以使用复合文字在函数调用中创建 long long
:
my_function(& (long long) {val});
但是,您将无法在函数 returns 之后使用 long long
的值。函数对 long long
所做的任何更改都不会影响 val
.
异常案例
如果 my_function
不使用 parameter
作为指向 long long
的指针,尽管它声明了类型,那么您可以向它传递一些已转换为long long
。 C 标准允许这样的用途,但这通常是不适合编写的代码,您可以传递哪些指针将取决于 my_function
在做什么。