为啥在VC++6.0下用C语言调用引用参数如:void Creat(SqList &L)总是提示&出错?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥在VC++6.0下用C语言调用引用参数如:void Creat(SqList &L)总是提示&出错?相关的知识,希望对你有一定的参考价值。

你好:

C 语言环境不提供这样的引用参数方式,只有 C++ 环境才有。

修改方法其实很简单:

第一步将参数中的 &L 变为 *L(赋地址调用方式),即 void Creat(Sqlist *L);

第二步将函数体内部的所有 L 变为 *L(L 为地址值,*L 取对应内存单元的内容)。

第三步将主调函数调用部分的变量加入取地址符 &,如 main() 函数体中的 Creat(&L);

引用函数的实质是赋地址调用,将其用赋地址调用的方法实现即可解决问题。
参考技术A 因为VC是一个集成的编程环境,既可以编写c程序也可以编写c++等程序;

而&在c中表示取址符,在C++中定义或声明变量时表示引用,区别这两种编程的简单方法是:
看它包含的头文件是什么,如果你c环境下用上述语句当然回报错了,然而在c++环境中则该方法是正确的,建议你改一下包含的头文件试试应该就可以了。。。
参考技术B 引用是C++的,C语言它表示取地址符号

用 结构体地址 调用 结构体中元素 非常慢的问题,怎么解决?但就C语言,不说引用

用地址调用结构体元素中的很慢,怎么解决?
如:struct A
int num;
;
如果函数这样调用int fun(A* a)
那函数体里面就全都是 a->num,这样调用速度比int fun(A a)里面的a.num慢很多啊,在一个追求计算速度的程序里面应该怎么写?

你从哪里看出来传指针速度慢?是你自己代码写的有问题吧。


函数中参数为结构体数据时,有两种处理方式:
 1.传递结构体指针。

 void sum(struct mystruct *node);


 2.传递结构体副本。

 void sum(struct mystruct node);

  在sum函数中创建所传递的结构体的副本,即将结构体的数据成员完全赋值给node.
 

优缺点:
  1.指针传递速度快,效率高,消耗存储空间小,但是无法保护数据不被修改,可以添加const 参数进行限制.
  2.副本传递,效率较低,消耗存储空间大,可以保护数据不被修改,适合于数据成员少而简单的结构体。


追问

真的慢,骗你对我有什么好处,附图,真心求教

这是示例代码,做一样的事,后面是计时

追答

你不怎么早把代码贴出来。

慢的主要原因,是因为你进行了大量的计算,每一次计算都要对结构体里面的成员进行操作。


这样解释一下吧,我们通常说传变量指针比传变量要快,指着是【函数调用】这个过程,也就是说从上下文从 调用函数 切换到 被调用函数 的过程。如果你传指针,只是穿一个地址过去,一般为4字节(32位计算机),而传一个结构体的变量通常要大于4字节,而且是远大于。对于你这样的设计,也就是

struct A
    int num;
;

是很少见的。因为这没必要。

上面说的快指的就是传值的快慢了。(这就相当于送信。一个是直接通过电子邮件把信的内容告诉别人了,而另一个还要快递员把信过去)


但在你的程序中,为什么传指针反倒比传值慢呢?

正如开头就说了,你进行了大量的计算,每一次计算都要对结构体里面的成员进行操作。

这样为什么慢呢,原因就在于传指针给 被调用函数 之后,被调用函数里的局部变量

int fun(A* a)

也就是a实际上是一个指针,它指向了这个结构体。但是,如果你想操作这个结构体的变量,必须要进行解引用,也就是 (*a). 这样一个操作,这个操作在cpu看来,就是知道某个变量的地址存在哪里,cpu得到这个地址上去才能找这个变量实际所处的地址。

这里可能有点混乱,注意理解指针的概念。

这样就增加了一个寻址的过程。

而如果是

int fun(A a)

这里的a就代表着这个结构体的实际地址,那么通过a. 就可以直接使用结构体的成员了。这样就没有更多的寻址的过程。


传指针每一步操作都比传值多一步寻址操作,你循环了这么多次,自然就多了很多步,浪费了很多时间。那在上面说的函数调用时节省的时间自然就被抵消了。


所以就有传指针比传结构体更慢的结果。

我最开始的回答也说了,指针传递速度快,效率高,这个快是“传递”快,而不是计算快。


如果我的回答解决了你的问题,请采纳!你的采纳是我答题的动力!

如果有问题,请追问!

参考技术A 一个传值,一个传地址,应用场景不一样,看设计了追问

有没有好的设计经验可以传授一下吗?要是用链表就只可能把下级指针往里面传,传值每次还要复制一遍内存,不知道有没有更好的方法

以上是关于为啥在VC++6.0下用C语言调用引用参数如:void Creat(SqList &L)总是提示&出错?的主要内容,如果未能解决你的问题,请参考以下文章

vc++6.0怎么编译多个C文件

如何用C语言读取word中的数据

为啥同样的C程序在VC++6.0可以运行,在VS2010就不可以?

用 vc++6。0 调试c程序怎么显示结果啊

C语言(VC++6.0)获取cpu编码

VC++6.0下C语言怎样控制光标