C語(yǔ)言*與&在操作線性表的作用詳解
在數(shù)據(jù)結(jié)構(gòu)線性表一章,對(duì)線性表有這些操作方法(Operation):
/*Operation*/ Initlist(*L);/*初始化操作,建立一個(gè)空的線性表L*/ ListEmpty(L);/*判斷線性表是否為空表,若線性表為空,返回值為true,否則返回false*/ ClearList(*L);/*將線性表清空*/ GetElem(L,i,*e);/*性表L中的第i個(gè)位置元素值返回給e*/ LocateElem(L,e);/*在線性表L中查找與給定值e相等的元素,如果查找成功,返回該元素在表中序號(hào);否則,返回0表示失敗*/ ListInsert(*L,i,e);/*在第i個(gè)位置插入元素e*/ ListDelete(*L,i,*e);/*刪除i個(gè)位置元素,并用e返回其值*/ ListLength(L);/*返回線性表L的元素個(gè)數(shù)*/
我們大致可以將上述函數(shù)分為兩類(lèi),一類(lèi)參數(shù)列表中沒(méi)有*,例如:ListEmpty(L);
另一類(lèi)在L或者e前面有個(gè)(*)號(hào),究竟是為什么呢?
我們可以從下面這些代碼得到啟發(fā)
#include <stdio.h> #include <stdlib.h> void test1(int a,int b) { int c=0; c=b; b=a; a=c; printf("%d\n",a); printf("%d\n",b); } int main() { int a=1; int b=2; test1(a,b); printf("%d\n",a); printf("%d\n",b); }
運(yùn)行結(jié)果如下,可見(jiàn)test1中a,b作為形參互相交換值對(duì)main函數(shù)中的實(shí)參并沒(méi)有影響
2
1
1
2
Process returned 0 (0x0) execution time : 0.118 s
Press any key to continue.
讓我們對(duì)上述代碼稍作改動(dòng)來(lái)觀察結(jié)果
#include <stdio.h> #include <stdlib.h> void test1(int *a,int *b) { int c=0; c=*b; *b=*a; *a=c; printf("%d\n",&a); printf("%d\n",&b); } int main() { int a=1; int b=2; test1(&a,&b); printf("%d\n",a); printf("%d\n",b); return 0; }
6422000
6422008
2
1
Process returned 0 (0x0) execution time : 0.033 s
Press any key to continue.
很顯然,此次的test1()方法對(duì)main函數(shù)的實(shí)參總算有了影響,因?yàn)楝F(xiàn)在的test()方法是直接對(duì)地址為6422000與6422008存儲(chǔ)單元數(shù)據(jù)域的修改。
我們繼續(xù)回到對(duì)線性表操作上來(lái),就會(huì)恍然大悟。例如:ListInsert(*L,i,e),倘若不加*,那么L就永遠(yuǎn)作為一個(gè)局部變量留在了函數(shù):ListInsert(L,i,e)中,沒(méi)法發(fā)生實(shí)際的改變。加了*才能保證L被帶出來(lái)。我們只需要在方法定義時(shí)給形參加上'*',在方法調(diào)用時(shí)給形參加上'&'就能獲得預(yù)期的效果
思考:另一種解決思路:是不是可以定義一種List Insert()方法,使得返回值為已經(jīng)修改好的鏈表L呢?
List Insert(List L,int i,ElememtType e) { /* 此處為對(duì)鏈表進(jìn)行插入操作 */ return List;//要注意這個(gè)返回的List值已經(jīng)被修改了 }
不過(guò)這也有個(gè)弊病,當(dāng)插入發(fā)生在表頭時(shí),L就必須要指向新的節(jié)點(diǎn),否則地址仍指向的是原來(lái) 的表頭結(jié)點(diǎn)。解決方法也有,就是在鏈表第一個(gè)節(jié)點(diǎn)a前再插一個(gè)無(wú)意義的頭節(jié)點(diǎn)b,這樣每次想要在表頭插入元素時(shí)只需插在a,b之間即可。
注:C語(yǔ)言中*a指向a的數(shù)據(jù)域,&則是讀取a的地址。
到此這篇關(guān)于C語(yǔ)言*與&在操作線性表的作用詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言線性表* &內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++?Linux?Socket網(wǎng)絡(luò)編程流程分析
這篇文章主要介紹了C/C++?Linux?Socket網(wǎng)絡(luò)編程,Linux環(huán)境中的C/C++?socket?與Window環(huán)境中的C/C++?socket類(lèi)似,本文所記錄的是TCP協(xié)議的socket編程,圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02C++實(shí)現(xiàn)逆波蘭表達(dá)式的例題詳解
逆波蘭表達(dá)式由波蘭的邏輯學(xué)家盧卡西維茲提出,它的特點(diǎn)是:沒(méi)有括號(hào),運(yùn)算符總是放在和它相關(guān)的操作數(shù)之后。本文將通過(guò)例題講講如何利用C++實(shí)現(xiàn)逆波蘭表達(dá)式,需要的可以參考一下2022-12-12C語(yǔ)言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言字符串/內(nèi)存的相關(guān)函數(shù),文中通過(guò)示例代碼總結(jié)的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09C語(yǔ)言指針應(yīng)用簡(jiǎn)單實(shí)例
這篇文章主要介紹了C語(yǔ)言指針應(yīng)用簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05VC通過(guò)托盤(pán)圖標(biāo)得到該所屬進(jìn)程的實(shí)現(xiàn)代碼
這篇文章主要介紹了VC通過(guò)托盤(pán)圖標(biāo)得到該所屬進(jìn)程的實(shí)現(xiàn)代碼,為了方便大家使用特將多個(gè)代碼分享給大家,需要的朋友可以參考下2021-10-10C語(yǔ)言入門(mén)篇--關(guān)鍵字static詳解
本篇文章是C語(yǔ)言系列基礎(chǔ)篇,C語(yǔ)言中,static是用來(lái)修飾變量和函數(shù):1.修飾局部變量–>靜態(tài)局部變量2.修飾全局變量–>靜態(tài)全局變量3.修飾函數(shù)–>靜態(tài)函數(shù)2021-08-08C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼
24點(diǎn)是一種益智游戲,24點(diǎn)是把4個(gè)整數(shù)(一般是正整數(shù))通過(guò)加減乘除以及括號(hào)運(yùn)算,使最后的計(jì)算結(jié)果是24的一個(gè)數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語(yǔ)言實(shí)現(xiàn)這一游戲,感興趣的可以了解一下2022-08-08