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