c语言reference
㈠ c语言中什么叫引用
引用(reference)是c++对c语言的重要扩充。引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*,例如: Point pt1(10,10)。
Point &pt2=pt1;,定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词,引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。
循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。
四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。
特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
㈡ c语言问题,什么叫引用啊
引用(reference)是c++对c语言的重要扩充。
一、引用的概念
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。
例如: Point pt1(10,10);
Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
pt1.offset(2,2);
pt1和pt2都具有(12,12)的值。
引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才
初始化它。例如下面语句是非法的:
Point &pt3;
pt3=pt1;
那么既然引用只是某个东西的同义词,它有什么用途呢?
下面讨论引用的两个主要用途:作为函数参数以及从函数中返回左值。
二、引用参数
1、传递可变参数
传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。
所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现
两整数变量值交换的c程序如下:
void swapint(int *a,int *b)
{
int temp;
temp=*a;
a=*b;
*b=temp;
}
使用引用机制后,以上程序的c++版本为:
void swapint(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
2、给函数传递大型对象
当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类:
const maxCard=100;
Class Set
{
int elems[maxCard]; // 集和中的元素,maxCard 表示集合中元素个数的最大值。
int card; // 集合中元素的个数。
public:
Set () {card=0;} //构造函数
friend Set operator * (Set ,Set ) ; //重载运算符号*,用于计算集合的交集 用对象作为传值参数
// friend Set operator * (Set & ,Set & ) 重载运算符号*,用于计算集合的交集 用对象的引用作为传值参数
...
}
先考虑集合交集的实现
Set operator *( Set Set1,Set Set2)
{
Set res;
for(int i=0;i<Set1.card;++i)
for(int j=0;j>Set2.card;++j)
if(Set1.elems==Set2.elems[j])
{
res.elems[res.card++]=Set1.elems;
break;
}
return res;
}
由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。
每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。
Set operator *( Set &Set1,Set &Set2)
{ Set res;
for(int i=0;i<Set1.card;++i)
for(int j=0;j>Set2.card;++j)
if(Set1.elems==Set2.elems[j])
{
res.elems[res.card++]=Set1.elems;
break;
}
return res;
}
三、引用返回值
如果一个函数返回了引用,那么该函数的调用也可以被赋值。这里有一函数,它拥有两个引用参数并返回一个双精度数的引用:
double &max(double &d1,double &d2)
{
return d1>d2?d1:d2;
}
由于max()函数返回一个对双精度数的引用,那么我们就可以用max() 来对其中较大的双精度数加1:
㈢ c语言被提示 undefined reference to
假设你已经正确编译和安装了sqlite,写个测试程序来测试:#include#include#include"sqlite3.h"intmain(void){sqlite3*db=NULL;char*zErrMsg=0;intrc;rc=sqlite3_open("test1.db",&db);if(rc){fprintf(stderr,"Can'topendatabase:%s\n",sqlite3_errmsg(db));sqlite3_close(db);exit(1);}elseprintf("openmydatasuccessfully!\n");sqlite3_close(db);return0;}用GCC来编译的时候总是会出现错误,编译的命令如下gcc-static-ohello-lsqlite3-L/usr/local/lib-I/usr/local/includehello.c错误信息如下/tmp/ccKeKpX9.o(.text+0x37):Infunction`main'::undefinedreferenceto`sqlite3_open'/tmp/ccKeKpX9.o(.text+0x51):Infunction`main'::undefinedreferenceto`sqlite3_errmsg'/tmp/ccKeKpX9.o(.text+0x73):Infunction`main'::undefinedreferenceto`sqlite3_close'/tmp/ccKeKpX9.o(.text+0x9b):Infunction`main'::undefinedreferenceto`sqlite3_close'collect2:ldreturned1exitstatus那么,恭喜你中招了。错误根本不在SQLITE也不在你的程序,而在GCC。Gcc的编译参数是有顺序的。正确的编译命令是:gcc-ohello-L/usr/local/lib-I/usr/local/include-statichello.c-lsqlite3
㈣ C语言undefined reference to `WinMain'这个是什么错误啊
没有定义winmain这个函数
你用的是vc或者vs吧
如果要用main作主函数,那么建的时候 要选consol 那个project.
如果你选了windows project , 那就得用winmain做主函数了。
这两种是不一样的。
㈤ c语言提示 undefined reference XX
函数定义时拼错了,拼成了dispaly
dispaly
display
㈥ 谁解释C语言中什么是值传递和地址传递
本质上都是值传递,因为传递的都是数值,地址也是用数值表示的。如果从作用上分类,值传递传送的是内存单元中存放的数据,这个数据是接收方要直接使用的,地址传递传送的是内存单元的地址(其实这个地址也是存放在某个内存单元中的),这个数据是给接收方间接使用的,因为它指向另一个内存单元,而这个被指向单元里的数据才是最终需要的。比方一下你就明白了:有两个抽屉AB,A和B中都有你要的东西,但抽屉在我这里,我把A里面的东西直接给你就是值传递,我把B的钥匙给你就是地址传递。
㈦ c语言 pass by reference 求解
/*
交换前 : a = 2, b = 5
经SwapByFre(int &a, int &b)交换后 : a = 5, b = 2
经SwapByAdd(int *a, int *b)交换后 : a = 2, b = 5
经SwapByVal(int a, int b)交换后 : a = 2, b = 5
Press any key to continue
*/
#include<stdio.h>
//按引用传递参数
voidSwapByFre(int&a,int&b){
intt=a;
a=b;
b=t;
}
//按地址传递参数
voidSwapByAdd(int*a,int*b){
intt=*a;
*a=*b;
*b=t;
}
/*
按值传递参数,该函数只会交换局部变量a和b的值,
不会影响主调函数的实参
*/
voidSwapByVal(inta,intb){
intt=a;
a=b;
b=t;
}
intmain(){
inta=2,b=5;
printf("交换前:a=%d,b=%d ",a,b);
SwapByFre(a,b);
printf("经SwapByFre(int&a,int&b)交换后:a=%d,b=%d ",a,b);
SwapByAdd(&a,&b);
printf("经SwapByAdd(int*a,int*b)交换后:a=%d,b=%d ",a,b);
SwapByVal(a,b);
printf("经SwapByVal(inta,intb)交换后:a=%d,b=%d ",a,b);
return0;
}
㈧ c语言中undefined reference to ""怎么解决
大部分原因是链接时缺失了相关目标文件
首先编写如下代码
// test.h
#ifndef __TEST_H__
#define __TEST_H__
void test();
#endif
// test.c
#include <string.h>
#include <stdio.h>
void test()
{
printf("just test it ");
}
// main.c
#include "test.h"
int main(int argc, char **argv)
{
test();
return 0;
}
然后输入以下命令,你会得到两个.o文件
$ gcc -c test.c
$ gcc –c main.c
编译时报错了,这是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件。编写如下命令即可。
$ gcc -o main main.otest.o