
在 09_二維指標與陣列 - 動態配置 [m][n] 陣列 中我們有提到
如果每 malloc 一份 memory 但卻沒有釋放,
將造成 memory leak 問題,一般而言程式真的不好抓,
(特別是已經寫了四、五千行程式要更很麻煩)
Edison 發表在 痞客邦 留言(1) 人氣(1,821)
在進入這階段時,請先確定前八個階段都確定會了再下來會好些。另外,有篇文章請先看過...
[console] 一維陣列與指標
[console] 二維陣列基本介紹
[console] 二維陣列與指標
Edison 發表在 痞客邦 留言(5) 人氣(84,861)
星期五晚上,哥哥的腳有些痛,我開車載媽媽還有哥哥去大湳,媽建議的跌打師父那裡看一下...
以下的對話全程都是台語,但為了別讓大家看不懂,我還是用國語翻譯好了。
一進去的時候,師父就說:
"你哪裡痛?"
Edison 發表在 痞客邦 留言(1) 人氣(927)
對於之前”指標特輯”的前三篇文,在程式中讓人感覺實用意義並不大,接下來要說的全都是重點,如果前三篇文沒有看懂的人,請先回去看懂吧。
1. 為什麼要用動態記憶體:一般我們使用陣列時,你不可以隨時改變陣列的大小,陣列的大小在宣告時就已經確定。所以不可能會有像以下的程式碼出現
int N = 10;
int a[N]; // complier error
N = 20;
a[N]; // complier
Edison 發表在 痞客邦 留言(3) 人氣(109,431)
現在,要為各位介紹CallByReference進行SWAP的做法。先聲明,CallByReference是在C++才有的概念,不過由於現在Complier幾乎沒有單獨支援C不支援C++的, 所以就算用C語言去寫CallByReference還是可被接受。
我們前面有提過CallByValue和CallByAddress,不管是哪種方法,OS都會再次配置副函式引數所需的記憶體空間,但CallByReference是非常特別的方法,OS是直接跑到主函式a, b的位址直接進行運算,並沒有再配置額外的記憶體。所以也有人說,使用CallByReference的速度會比較快。CallByReference的寫法大致如下:
void swap(int &c, int&d){…..}
void main()
{
int a, b;
swap(a, b);
}
Edison 發表在 痞客邦 留言(3) 人氣(2,459)
接下來的這個其實不是我要說明,而是留給各位思考,這個問題並不會太難或是太複雜...現在再次考慮 SWAP_A 的副函式,只是我寫的方式換了
原本的:
// ====================================
void Swap_A(int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
Edison 發表在 痞客邦 留言(3) 人氣(2,114)
這是一個討論很久的名詞問題。
void f(int *x)
{
printf("%d", *x);
}
int main()
{
int y=10;
f(&y);
return 0;
}
Edison 發表在 痞客邦 留言(4) 人氣(7,011)
現在,假設我要寫一個函數,這個函數是交換二個整數,也就是 a 的值給 b, b 的值給 a,該怎麼寫?這種問題是一般初學者最常犯的錯誤 – 使用 call by value。下面的例子說明了為什麼不能使用 call by value 的方式進行 swap 的動作。在看此例的執行結果時,手邊一樣先準備好紙跟筆,畫出各變數的記憶體位置及儲存值,對學習會很很大的幫助。
原始碼:
// ====================================
// FileName: CallByValue.cpp
// Author : Edison.Shih.
// Complier: VC 2008
Edison 發表在 痞客邦 留言(1) 人氣(3,086)
指標的指標,說穿了只是雙重指標而已。假設 ptr1 是指向變數a的指標,ptr2為指向ptr1的指標,那麼 ptr2 就是變數a “指標的指標”(ptr2→ptr1→a)。這部份很容易搞亂,麻煩請準備紙筆在手邊會比較方便。
現在考慮以下指令:
int a = 10;
int *ptr1 = &a;
Edison 發表在 痞客邦 留言(2) 人氣(8,774)
接下來為各位介紹陣列和指標的關係。在這裡要先跟大家討論說明,陣列其實本身就是一種指標,但指標本身是一種陣列嗎?答案是否定的,但你的確可以把指標當作陣列在使用(也就是所謂的動態陣列,這個以後會提到)。
我們先設一個一維陣列,其內容為 for(i=0; i<MAX; i++) Array[i] = I; 由於OS分配給陣列的記憶體位置是連續的,所以配置好後其記憶體示意圖如下所示。
儲存值
|
0
|
1
|
2
|
3
|
4
|
記憶體位址
|
12FF44
|
12FF48
|
12FF4C
|
12FF50
|
12FF54
|
Array
|
Array[0]
|
Array[1]
|
Array[2]
|
Array[3]
|
Array[4]
|
Edison 發表在 痞客邦 留言(9) 人氣(47,563)