資料結構(二) C 中的

2021-10-06 20:22:39 字數 1720 閱讀 7301

關於c++中*和&的用法及意義這裡不再贅述,在各大**和論壇中有詳細且明確的解釋。

本文關注 *&,即 *與&同時使用的情況,以及為什麼 *&可以實現改變指標。

首先看一段**:

int

main()

執行結果:

可以看到a的值為1,取位址符&取到a的位址為0x66ff24,並把位址的值賦給了b,b的值為0x66ff24.

再次利用取位址符&,取到b的位址為0x66ff20,即為位址的位址。

隨後我們建立兩個函式,傳入引數分別為 *p和 *&p。

void

foo1

(int

*p)void

foo2

(int

*&p)

執行foo1():

int

main()

執行結果:

執行foo2():

int

main()

執行結果:

可以觀察到p的位址並不相同,傳入 *&p的函式中,p的位址與函式外相同,傳入 *p的函式中,p的位址與函式外不同,該位址從未出現過。

執行以下**:

void

foo3

(int

*p)int

main()

void

foo4

(int

*&p)

intmain()

執行結果:

第二段**成功地將b的值改為了0,第一段**沒有改動b的值。因為 *&b傳入的是b的位址, b傳入的是b的值,並在函式中臨時分配了另一位址0x66ff00用於儲存0x66ff24.所以在傳入b時不會改變函式外b的值。

上**!

這也是為什麼只有*&b可以改變指標的值,在上面我們成功把b的值修改為了null。

最後再看一段**,乙個*&的重要應用——變長一維陣列。

該**的目標是確立乙個具有新長度的陣列,把陣列a的元素複製到這個新陣列,最後改變陣列的值,是它可以引用新陣列。

template

<

class

t>

voide changelength1d

(t *

&a,int oldlength,

int newlength)

傳入 *&a,賦予a乙個新的陣列位址,實現函式外陣列a長度變化。假設原陣列a的位址為0x1,函式中temp的位址為0x9.經過該函式,原陣列的位址改為0x9。

之後呼叫陣列a,首先找到儲存陣列位址的位址,調出其資料0x9,再依據線性表呼叫a中元素。

C 基礎 C 中的資料結構

陣列具有以下的特點 陣列屬於線性結構,在記憶體中是連續存放的。陣列的元素型別必須相同。陣列可以直接通過下標訪問。陣列的查詢速度非常快,新增和刪除速度慢。陣列在初始化時要指定陣列長度。動態陣列具有以下的特點 arraylist的底層其實就是乙個陣列。arraylist在宣告時不必指定長度,會根據儲存的...

資料結構 二

字串處理 strlen 用來計算字元的長度,並不包括結束字元 0 空字元長度為0 1 include 2 3 int strlen char string 4 10 int main 11 strcpy char str1,char str2 用來拷貝字串,把str2每個字元都拷貝到str1中,直到...

資料結構(二)

1.順序表和煉表綜合 在遞增有序的順序表中程式設計實現a a b c typedef intelemtype include sqlist.h 即為資料結構 一 順序表部分 include int main else continue else continue output mylist1 sys...