C 面試筆記 指標和引用

2022-07-13 03:00:10 字數 2660 閱讀 4825

#includeusing

namespace

std;

void swap1(int p,int

q)void swap2(int *p,int *q)

void swap3(int *p,int *q)

void swap4(int *p,int *q)

void swap5(int &p,int &q)

intmain ()

swap1傳遞的是值的副本,在函式中只是修改了形參p、q(實際是a、b的乙個拷貝),p、q的值確實交換了,但是它們是區域性變數,不會影響到主函式a和 b 。當函式swap1生命週期結束時,p、q所在的棧也就被刪除了。

swap2傳遞的是乙個位址進去,在函式體內的形參*p、*q是指向實際的引數a、b位址的兩個指標。

這裡要注意:

int *temp;

*temp=*p;

是不符合邏輯的,int *temp新建了乙個指標(但是沒分配記憶體)。*temp=*p不是指向而是拷貝。把*p所指向的記憶體的值(也就是a 的值)拷貝到*temp所指向記憶體裡了。但是int *temp不是不分配記憶體嗎?的確不分配,於是系統在拷貝時臨時給了乙個隨機位址,讓它存值。分配的隨機位址是個「意外」,且函式結束後不**,造成記憶體洩漏。

swap3傳遞的是乙個位址,在函式體內的引數*p、*q是指向實際引數a、b位址的兩個指標。

這裡要注意:

int *temp;

temp=p;

int *temp;

q=temp;

但是函式swap3不能實現兩數的交換,這是因為函式體內只是指標的變化,而對位址中的值卻沒有變化。

swap4可以實現兩數的交換,因為它修改的是指標所指向位址中的值。

swap5函式與swap4相似,是乙個引用傳遞,修改的結果直接影響實參。

答案:

swap3,swap5

char *stra()

解析:這個str裡存在的位址是函式stra棧裡「hello world」的首位址。函式呼叫完成,棧幀恢復呼叫stra之前的狀態,臨時空間被重置,堆疊「回縮」,stra棧幀不再屬於應該訪問的範圍。這段程式可以正確輸出結果,但是這種訪問方法違背了函式的棧幀機制。

但是只要另外乙個函式呼叫的話,你就會發現,這種方式的不合理及危險性。

如果想獲得正確的函式,改成下面這樣就可以:

char *stra()

首先要搞清楚char *str 和 char str :

1charstr ="hello world";

是分配乙個區域性陣列。區域性陣列是區域性變數,它所對應的是記憶體中的棧。區域性變數的生命週期結束後該變數不存在了。

1char*str ="hello world";

是指向了常量區的字串,位於靜態儲存區,它在程式生命期內恆定不變,所以字串還在。無論什麼時候呼叫 stra,它返回的始終是同乙個「唯讀」的記憶體塊。

另外想要修改,也可以這樣:12

345char*stra()

通過static開闢一段靜態存貯空間。

#includeusing

namespace

std;

intmain ()

解析:本程式的結構如下:

(1)先宣告了乙個整型陣列a[3],然後分別給陣列賦值。

(2)又宣告了兩個整型指標 p、q,但是並沒有定義這兩個指標所指向的位址。

(3)使整型指標 p 的位址指向 a(注意 a 就是a[0]),使整型指標 q 的位址指向 a[2]。

可實際驗證程式如下:

#includeusing

namespace

std;

intmain ()

上面的輸出結果分別是:

002dfd24

0002dfd2c22

2q 的實際位址是 002dfd2c,p 的實際位址是 002dfd24。 002dfd2c-002dfd24=0x08(十六進製制減法),相差是 8。

q-p的實際運算是(q的位址值(002dfd2c)- p的位址值(002dfd24))/sizeof(int),即結果為 2 。

void (*f)();//f是乙個指向函式的指標變數,它可以代替這個函式例如: int c;c=(*f)(a,b);或者int max(a,b);int (*f)(a,b);p=max;--這裡*p指向了max的開端,所以*p也變成了max函式了。

void *f();

const

int *a;

const

int *const

a;int *const a;

指標陣列和陣列指標 

a是指標陣列,是指乙個陣列裡面都裝著指標。例如:int *ptr.

b是乙個陣列指標,是指指向乙個陣列的指標。例如:int (*a)[3];

C 筆記 引用和指標

1.為什麼傳引用比傳指標安全 由於不存在空引用,並且引用一旦初始化為指向乙個物件,他就不能被改變為另乙個物件。因此引用安全。2.複雜指標 2.1乙個有10個指標的陣列,該指標是指向乙個int型的 int a 10 2.2乙個指向有10個整形數陣列的指標 int a 10 2.3乙個指向函式的指標,該...

c 學習筆記 指標和引用

指標和引用的區別 1 引用是乙個變數的別名,本身不單獨分配自己的記憶體空間,跟原來變數共享記憶體空間 而指標需要重新分配自己的記憶體空間,用來儲存指向物件的位址。2 引用訪問乙個變數是直接訪問,而指標是間接訪問。3 引用一經初始化就繫結到乙個記憶體空間,且只能是這個記憶體空間的名字,定義時必須初始化...

引用和指標筆記

指標和引用 1.區分定義和作為形參的意義 定義 int p 定義了乙個指標變數p 而不是指標變數 p 做形參 void f int p 要求使用整型的指標變數來作為形式引數,正常傳入時直接用指標變數即可,加上 後表示的是乙個整型數,帶入程式則會報錯 而引用,就是給同乙個位址賦予了新的名字,讓一塊空間...