有关在C语言数据结构书中一个参数表中看到的一个以&打头的参数
本帖最后由 cindypeng 于 2023-1-21 12:36 编辑原例题是
typedef struct
{
float Realpart;
float Imagepart;
}Complex;
void Create(&Complex C,float x, float y)
{
C.Realpart=x;
C.Imagepart=y;
}
float GetReal(Complex C)
{
return C.Imagepart;
}
困惑一:为什么要在结构体变量面前加一个取地址符,作用是什么
(百度了一下,说是引用参数,可是大部分的引用型参数不是前面有个数据类型吗?)
这里的&是取地址,你都知道了。 但是,方法 Create( p1, p2, p3) 这3个参数在传入时是 值 传入, 那 会在内存中栈中创建3个内存块,然后把对应的参数拷贝到这些内存块。 使用 & , 同样会创建3个内存块, 但是因为有 & ,所以内存块中对应的位置不是参数的拷贝,而是参数对应的内存地址(址传入)。这样就省掉了拷贝的过程。 理论上是更快的速度。 因为 使用了内存地址, 所以对此参数的操作会直接影响参数所对应的原内存对象, 即, 如果你把这个地址给释放了对应的内存, 那么参数对应的原内存对象就被释放了。 如果不使用地址,那么 对参数的操作,不会对参数对应的原内存内存造成任何影响。 本帖最后由 xzqsr 于 2022-12-10 19:59 编辑
楼上已经进行了非常深刻的讲解,我补充个直观例子吧
void test1(int x){
x=1;
}
void test2(int &x){
x=2;
}
int main()
{
int x = 0;
printf("%d\n", x);
test1(x);
printf("%d\n", x); // 输出0,test1()函数内部修改的是x的副本,x本身未变
test2(x);
printf("%d\n", x); // 输出2,test2()函数内部修改的是x本身
return 0;
}
是取地址的意思,c语言没有引用概念,不过可以使用指针常量来代替引用。Type * const cnt=&a; c语言不能这样用void Create(&Complex C,float x, float y),这是c++的写法
或许应该这样:
定义的时候void Create(int *Complex C,float x, float y);
调用的时候void Create(&Complex C,float x, float y);
很多c语言入门书中都有在书中开头有一道关于用传值传址方式比大小的经典算法,
把它当成一个可以传进去可以随便改的参数就好。
不过 `&` 符号应该在类型后面接,而不是类型名之前。
```cpp
#include <stdio.h>
// 传值 (复制一份)
int inc_by_val(int v) {
return v + 1;
}
// 传址 (引用变量的地址)
void inc_by_ref(int &v) {
v++;
}
// 传址 (v 有可能是空指针,需要额外检查)
void inc_by_ptr(int *v) {
if (v != NULL) (*v)++;
}
int main() {
int a = 1;
printf("a(原) = %d\n", a);
inc(a);
printf("a(改) = %d\n", a);
}
```
输出结果分别是 `1` 和 `2`。 void Create(&Complex C,float x, float y)这种声明无论是c++还是c语言都是错误的。 void Create(&Complex C,float x, float y)
这行代码并不是C或的语法。
它是在C++11中新支持的一种语法,
表示这个变量传入的是地址,类似于“*”,
但是用这个变量的时候,不用像上面那个用*a = ...的,直接用a = ...就可以
可以自动变量名转换为地址。
也就是说,在一个函数中更改了这个变量,调用这个变量处的数据也会一起变化。
有时候也有人用这种语法来加快代码的运行效率,因为这样写,变量传入地址,
而不是像标准变量那样将数据复制一遍,所以运行效率也会更高
注意,这种语法在C语言、C++89、C++98中没有定义,所以只能在C++11或以后使用!
希望这对你有用 ‘v'
页:
[1]