當初學順序鍊錶的時候,書上就出現了這樣的語言,如下所示:這裡面的&l第一遍看的時候想當然的認為是取了sqlist結構體的l的位址,沒有細想。然後又看到了這句。status getelem(sqlist l,int i,elemtype &e) //這根本就不是取位址符
這裡的elemtype就是int的型別這樣整個倒是顯得非常奇怪那麼我們模擬這樣的形式那麼可以寫成如下這種方法
status getelem(sqlist l,int i,int &e)
int *a,*b; /* 定義了兩個整型的指標 */
int **a, **b; /* 定義了整型指標的指標 */
那麼我們看下面他寫的這個東西://那麼難道說是定義了整型變數為位址的變數e
int &e;
顯然這裡可以看出由於l指標指向的是elemtype型別,所以e是elemtype型別的。所以以上模擬顯然是不對的。
查詢了很多的資料發現,這個實際上是c++裡的形參符號,必須要在跟在資料型別的後面使用。在函式內部對形參的操作都等同於直接操作原變數。請看下面的例子把實參的值傳送給函式區域性工作區相應的副本中,函式使用這個副本執行必要的功能。函式修改的是副本的值,實參的值不變。
可以看到,a與b的值並沒有發生更換。
還有第二種方式可以看到,形參變化影響實參#include // 利用指標的經典解法
void swap(int *a, int *b)
void main()
#include void swap(float *a, float *b)
void main()
可以發現ab值並沒有發生變化傳遞的是陣列的首位址
對形引數組所做的任何改變都將反映到實參陣列中什麼是引用?#include #include void sub(char *b) //在c++語言中也可以使用b來寫
void main()
引用:他用來給乙個物件提供乙個代替的名字//運用了c++的語法
#include #include // 引用引數實現交換
void swap(int &a, int &b)
// using main to test
int main()
有些文章說道,通過引用的方式傳遞給函式的是變數的位址,這種方式叫做位址傳遞方式,還提到這是和「值傳遞」十分不同的方式。那麼sqlist *&l和sqlist *l的關係就能捋清楚了它的意思是,l是對list的引用,函式體內對l的操作,就相當於對head的操作,所以這種情況下對l的更改才會發生到list上。有些書說道:「引用實際上是取了個『別名』」
還有的書和文章說道引用是比通過指標傳遞更加高效的方式,因為不需要開闢新的記憶體空間用來拷貝實參的位址。
當list指標作為函式引數傳進去時,意為你要把指標list所指的位址值賦給指標l,(可以模擬int型別,畢竟指標本質上也是一種資料型別)。這就意味著此時的實參list跟形參l並不是同乙個指標,而是指向同乙個位址的不同指標。所以你對l的操作並沒有發生到list身上。達不到預期效果。
c語言不存在「引用」的概念,符號「&」只是表示取位址,而c++才有「引用」的含義。比如對於這段**——
//c語言不存在「引用」的概念,符號「&」只是表示取位址,而c++才有「引用」的含義。
//比如對於這段**——
#includeint main()
,/*使用gcc編譯器編譯會報錯:」錯誤:expected identifier or 『(』 before 『&』 token「,但是使用g++編譯就不會報錯。*/
資料結構與演算法分析 迴圈佇列的陣列實現 C語言
佇列,也是一種表,使用佇列的時候在表的末端隊尾插入元素,在表的開頭刪除元素,因為先插入的元素先被訪問,故佇列又稱為先進先出表,其基本操作為進隊與出隊,對應著插入與刪除,也要先進行相應的判空判滿 佇列可以用鍊錶實現,也可以用陣列實現,這裡用陣列實現,每乙個佇列都有fron和rear來指向隊頭和隊尾,我...
資料結構與演算法 資料結構C 堆
資料結構c 堆 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 小堆 大堆 中 任一結點的關鍵碼均小於 大於 等於它的左右孩子的...
C 資料結構與演算法 棧
棧,zhan,從木從戔。牲口棚,馬棚。棧的結構是很簡單的,簡單來說就是乙個先入後出的列表。pragma once include include include using namespace std class illegalparametervalue public exception ille...