如何转换变量地址并将其传递给 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_functionparameter 指向的 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 在做什么。