# 指標筆記 ## 筆記傳送門 * [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)