---
# System prepended metadata

title: 指標筆記

---

# 指標筆記

## 筆記傳送門
* [C語言筆記](https://hackmd.io/0cmnBvxvT4GFk-sFeOtl4g?view)
* [關鍵字筆記](https://hackmd.io/wkJEDjCGTTWV-IjvEzXjYA?view)
* [函式筆記](https://hackmd.io/HC69PJDBT5KLd-LthrD14Q?view)
* [陣列筆記](https://hackmd.io/uyU7KciRRp2rnZngbA5NoQ?view)
* [字串筆記](https://hackmd.io/jIwQLyodSjamUksBY0JbhQ?view)

## 前情提要:

### int num=;宣告後會有以下資訊
![](https://i.imgur.com/EGGQzEx.png)

### 查看變數的記憶體位置
>& 取址運算子,把變數的記憶體取址出來
>%p 以==16進位==輸出變數的記憶體位置
![](https://i.imgur.com/M3UmDJR.png)

### 陣列的記憶體位置
>陣列的==記憶體位置為連續==,&arr[0]=arr
>&arr[0]+==資料型態的bytes數量===&arr[1]
![int型別的陣列](https://i.imgur.com/lRCuLfx.png)

==arr陣列本身就是一串記憶體,不需要再取址==

## 指標--指標變數
* ==一種變數型態==,用途是儲存==記憶體位置==
* 宣告:==資料型態\*變數名稱==
>int num = 20;
>int \*ptr= NULL (指標變數的初始化)
>ptr= & num; (ptr的值=num的記憶體位置)
>![](https://i.imgur.com/Y4Dx3ya.png)
* >> ptr的值是 num 的記憶體位置
* >> ptr 指向 num
* >> ptr 同時有著自己的記憶體位置
* >> 指標變數的型態==必須指向變數的型態或是void==
* >> int \*ptr , num ; 只有ptr會是指標變數,num則是一般變數

## 指標的運算子(& and \*)

### &的用法
>把==變數的位址==取出來
>scanf("%d",&num);

### \*的用法
>把指向位址的值取出來
>printf("%d",\*ptr);
>\*ptr=10;

## 指標的運算

int arr[5]={0, 1, 2, 3, 4, 5};
int \*ptr = arr;
printf("%d",\*(ptr+1));
>會輸出arr[1]的值

* 指標只有加減法
* 加減法跳躍的空間大小取決於==指標的資料型態==
* ==先跳躍空間再取值==
* >\*(ptr+1) != \*ptr+1

## const指標
![](https://i.imgur.com/PxzEOuk.png)
### 左邊程式碼解釋:
* (const int \*ptr= &a) 表示指向整數的==指標==
* 不能通過指標来修改所==指向的值==
### 右邊程式碼解釋:
* (int * const ptr=&a) 表示指標是==常量==
* 不能通過指標来指向==其他記憶體位置==

## 函式指標傳址

* 宣告函式時裡面放==指標型別== function(int \*p)
* 呼叫函式時裡面放==變數位址== function(&num)
![](https://i.imgur.com/2d3Uvoy.png)

