「data structure」的圖片搜尋結果

資料結構複習(二):陣列&指針

LUFOR129
4 min readSep 20, 2018

如果把寫程式看成樂高堆疊積木,現在的狀態大概是怎麼製造塑膠吧,但正因為基礎所以困難,多看看其他人的blog,多想想大概就會懂了,文末放其他blog推薦。

指針

指針大概是大一修C時最怕的東西了吧~其實把指針具體畫出來後就會很容易的。!!注意!! 指針是數據結構非常重要的部分,一定要好好學,不然後面會聽不懂。

指針,顧名思義就是指向某數據的箭頭 -> ,但資料又沒手,怎麼指?就是處存你的記憶體地址,通過 *(還原符) 和 &(地址符),可以簡單的操作記憶體。

int a=9;
int *ptr=&a;
print("%d",a); //9
print("%x",&a); //AX7O648EEE
print("%x",ptr); //AX7O648EEE
print("%x",&ptr); //BESFAS824
print("%d",*ptr); //9

!!注意!!

不要因為ptr和a前面都有int就認為他們是相同數據類型,他們是不同數據類型的!!!不要搞混

假如有天ptr要指向B或其他指針
int B=10;
int C=18;
int *ptr2=&C;
ptr=B // X 根本不同數據類型
ptr=&B // O 把B地址存進ptr中,ptr指向B,*ptr=10
ptr=ptr2 // O 合法,把C的地址存進ptr中, *ptr=18
ptr=&ptr2 // O 合法,把ptr2的地址存進ptr中,**ptr=18

當然你可能會認為,使用指針到底有什麼用呢?為什麼一定要偷偷摸摸間接傳值,不能正大光明傳遞數值嗎?

舉個例子:

今天想要用C語言寫一個簡單的數值交換,下面程式會通過嗎?

void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}
int main(){
int a = 19;
int b = 28;
swap(a,b);
printf("%d,%d",a,b); //此時a、b會變成多少?
return 0;
}

Ans. a和b 依舊是原來的樣子根本沒有改變。為什麼明明成功執行了swap函數卻無法改變呢? 這是因為C語言採用的是名為call-by-value。當你傳遞值給函數時,並不是"真的"把東西給函數。而是,系統會幫你複製數值給函數。main的a、b 與swap的a、b是不同的a、b,要解決這項問題,我們要採取call-by-address。

call-by-addressvoid swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(){
int a = 19;
int b = 28;
swap(&a,&b);
printf("%d,%d",a,b);
return 0;
}

此時系統會幫忙在記憶體中複製"指向物的位置"而非複製"參數值"了。當函數要使用這些記憶體位置時,透過"*"來還原地址即可達到改變數值的效果了。

陣列

陣列簡單來說就是一個連續記憶體空間。在C語言當中,當你建立陣列後系統會自動幫你轉成"指向連續記憶體第一個位置的指標",其他人寫的太好的,我就不寫了(( ̄Д ̄),詳細參考:

--

--