or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
社課額外補充教材 : 指標 & 參照
如果你覺得社課還算輕鬆,這裡提供你一些額外的補充教材。
這些是我們在備課的時候覺得稍微進階,或是篇幅太多,而沒有放在正式社課的內容。
這邊有目錄,左邊也有,可以跳到自己想看的地方
- 社課額外補充教材 : 指標 & 參照
- 基本概念
- 宣告方式
- 專用的運算子
- 用法
- 指標的另一種使用方式
- 函數中的使用方式
- 有注意到嗎
- call by value
- call by address
- call by reference
建議必看的地方 :
全部
基本概念
指標的基本概念要從變數的資料到底存了什麼開始
當我們呼叫變數後,電腦會從記憶體隨機抓一個空間
而這空間會放着資料,也就是變數的值
而指標不一樣,在宣告空間後,空間放的值不是變數的值
而是一個記憶體位置
宣告方式
專用的運算子
爲什麼要先說這個而不是用法?
因爲就連最一般的賦值都要用到這個。
用法
賦值
我們在一開始的時候說過,指標存的是記憶體空間
那如果直接賦值的話呢?
出錯啦!
c++為了避免有人亂打,將指標的值和一般的值做了區隔
也就是「int*」,當然,如果是 char 的指標那就是 char*
那到底怎麼用?
指標存的是記憶體位置,所以我們要指定一個位置給他
賦值方法
發現了嗎?因為指標的值是記憶體位置,
所以可以透過指標更改那個位置的值
上面賦值的解說
請不要出現下面的寫法
會出現錯誤,如果沒有錯誤,請還是不要用
如果沒有出現錯誤,那就是你的電腦沒有阻止你存取存放常數的地方
你如果更改了指標的值就可能會永久性更改那常數的值
指標的另一種使用方式
我們知道指標必須仰賴另一個變數才能存值
但其實並非如此,它需要的是一個記憶體位置
也就是說,如果我們能為指標再開一個記憶體位置,我們就不需要變數
先備觀念
記憶體有所謂的堆疊區(stack)和堆積區(heap)
堆疊區是我們一般宣告方式中會使用的
它在程式結束時會自動刪除,不管裡面還有沒有東西
不過,它的空間比堆積區還要小很多
而且變數以非常整齊的方式放置,並不完全是隨機存取
堆積區會從電腦的記憶體中擴充空間,而非堆疊區是固定的大小
所以它能比堆疊區放更多的資料
不過相對的,它也不會自動刪除,需要透過人工刪除的方式
也因為這樣,堆積區的空間經常中間有未使用的地方
使得它不像堆疊區那樣整齊
堆積區的使用
注意:只能使用指標連接堆積區空間
透過這種方式,就能讓指標擁有能使自己存值的記憶體位置
函數中的使用方式
在這裡簡單說一下函式的概念
在數學有所謂的函數,程式也有
有回傳值的叫做函數,沒有回傳值的叫做函式
數學的函數:
當丟一個 \(x\) 進去後,\(f(x)\)會經過它對 \(x\) 的動作並回傳一個 \(y\)
程式的函數:
如果以上面的例子來寫
不過不要誤會了,參數在 main 函數的名字不用和他在 \(f(x)\) 中的名字相同
也就是說我可以把上面的 \(f(x)\) 改成這樣:
結果會是一樣的
有注意到嗎
不論我在 \(f(x)\) 中對 \(x\) 如何瞎搞,原本的 \(x\) 都不會變
這樣只會輸出你原本輸入的值
這是因為參數在傳遞時有分三種方式,這一種會複製資料過去
call by value
使用方式:
call by value 會複製參數的值到函式中
所以在main函式中的 \(x\) 還是 1
call by address
使用方式:
call by address 的概念是把變數的記憶體位置複製一份到函式中的指標
使函式中的指標指向原本的變數,並通過該指標更改原本變數的值
所以,main 函式中的 \(x\) 會變成 \(2\)
call by reference
在說使用方式之前,先說說什麼是參照(reference)
參照並沒有記憶體空間,它只是一個變數的別稱
並非像指標一樣還會有個獨立的記憶體空間
但也因此,參照必須在宣告時指定為某一變數
而且無法更改
使用╱賦值方式:
讓我們回到 call by reference
使用方式:
這樣,在 \(f(x)\) 中的 \(x\) 會被宣告為 main 函式中 \(x\) 的參照
你可能會覺得很奇怪,為什麼名稱可以一樣?
這是因為在 \(f(x)\) 中的 x 在 main() 中不存在,反之亦然
main 函式中的 \(x\) 也會變成 2
指標的概念博大精深,在之後教手刻 STL 的時候也會用到
必定要非常熟悉
而且這樣你就贏過很多學長姐了