1 of 31

指標

講師:陳楷元

2 of 31

大綱

  • 如果沒有指標
  • 記憶體
  • 指標的操作
  • 指標與陣列

3 of 31

如果沒有指標

4 of 31

函式中改值

a=3 b=5

a=5 b=3

5 of 31

複製陣列

b: Hello

Error!

6 of 31

記憶體

參考自2021資芽指標ppt

7 of 31

教室裡有10種人

  • 1種是會二進位的人
  • 另1種是不會二進位的人

8 of 31

解讀2進位與16進位

  •  

A=10 D=13

B=11 E=14

C=12 F=15

9 of 31

不同數字系統間的轉換

bin

hex

dec

10 of 31

不同數字系統間的轉換

  • 2轉10: 同解讀
  • 10轉2: 用2的冪次湊
  • 2轉16: 四個一組見對照表
  • 16轉2: 見對照表
  • 10轉16: 10轉2,2再轉16
  • 16轉10: 同解讀

11 of 31

記憶體就像是陣列

0x00

0x02

0x01

0x03

0x04

0x05

0x06

0x07

0x08

0x09

陣列用index取值,

記憶體用16進位取值

12 of 31

變數宣告與記憶體

int a=5;

Step 1. 電腦找到可以用的格子

Step 2. 標記變數名稱

Step 3. 將值存入

0xff

a

5

13 of 31

變數操作與記憶體

a++;

Step 1. 電腦利用變數名稱找到對應記憶體

Step 2. 根據地址對該變數進行操作

0xff

a

5+1

變數名稱給人方便,

但電腦是根據記憶體做事

14 of 31

指標的操作

15 of 31

指標是什麼?

  • 指標是變數的一種
  • 變數都有類別、名字、位址、值四大基本要素

16 of 31

指標變數

  • 類別:指向變數的類別
  • 名字
  • 值:指向變數的位址
  • 位址:無論指向何種變數,皆占8bytes

不同變數值可能相同,

但位址必定不同

17 of 31

整理

  • sizeof (int) = 4 bytes
  • sizeof (float) = 8 bytes
  • sizeof (double) = 8 bytes
  • sizeof (char) = 1 byte
  • sizeof(pointer) = 8 bytes

18 of 31

NULL vs nullptr

  • C 只有 NULL ,意思是空指標
  • C ++ 的 NULL ,意思是所有型別中的0
  • C ++ 11 有nullptr,意思是空指標

  • 結論:當你意指空指標,建議寫C用NULL,寫C++用nullptr

19 of 31

宣告&初始化

* (宣告時) 無意義,表後面是指標

(其他狀況) 取值

&:取位址

20 of 31

宣告&初始化

21 of 31

Ex1

取值

的值

取位址

*

&

i

無意義

5

a

iptr1

5

a

b

iptr2

5

a

c

22 of 31

Ex2

取值

的值

取位址

*

&

i

無意義

5

a

iptr1

5

a

b

iptr2

a

b

c

23 of 31

思考1

a=5

b=3

*ptr1=5

*ptr2=3

24 of 31

思考2

a=3

b=5

*ptr1=5

*ptr2=3

25 of 31

指標與陣列

指標陣列 vs 用指標存陣列

26 of 31

指標陣列

欲將v陣列元素歸零:

27 of 31

用指標存陣列

陣列名稱的值就是

陣列的起始位址,

即a=&(a[0])

28 of 31

用指標存陣列

29 of 31

用指標存陣列

指標存陣列,

指標可當成陣列用

欲將v陣列元素歸零:

30 of 31

用指標存陣列

指標當成陣列用,

可以跑,更好用

欲將v陣列元素歸零:

p++指的是讓p指向陣列中下一個元素,這裡是指加上sizeof(int)

31 of 31

課堂練習

https://neoj.sprout.tw/problem/8857/

找出給定陣列的最大值。但是你現在只有:

這個陣列有幾個元素

一個指向陣列頭的指標

一個指向陣列結尾的指標