指標的指標 教學與筆記。
基本宣告
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h>
void main() { int p = 10; int *ptr1 = &p; int **ptr2 = &ptr1;
printf("p = %d\n", p); printf("&p = %p\n", &p);
printf("*ptr1 = %d\n", *ptr1); printf("ptr1 = %p\n", ptr1); printf("&ptr1 = %p\n", &ptr1);
printf("**ptr2 = %d\n", **ptr2); printf("*ptr2 = %p\n", *ptr2); printf("ptr2 = %p\n", ptr2); }
|
結果:
1 2 3 4 5 6 7 8
| p = 10 &p = 0x7fff22f90794 *ptr1 = 10 ptr1 = 0x7fff22f90794 &ptr1 = 0x7fff22f90798 **ptr2 = 10 *ptr2 = 0x7fff22f90794 ptr2 = 0x7fff22f90798
|
進階練習
沒使用指標的指標
以下不會改變 localPtr 本身:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h>
int value = 5;
void changePtr(int *ptr) { ptr = &value; }
void main() { int localValue = 1; int *localPtr = &localValue; changePtr(localPtr); printf("%d\n", *localPtr); }
|
因為 changePtr 中 ptr 的值是 localPtr 的複本,屬於傳值。
類比在單純的 int 函式:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h>
int value = 5;
void change(int a) { a = value; }
void main() { int localValue = 1; change(localValue); printf("%d\n", localValue); }
|
同樣不會改變 localValue 的值。
正確使用雙重指標用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h>
int value = 5;
void changePtr(int **ptr) { *ptr = &value; }
void main() { int localValue = 1; int *localPtr = &localValue; changePtr(&localPtr); printf("%d\n", *localPtr); }
|
使用雙重指標直接指定
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h>
void main() { int Value = 1; int Value2 = 2;
int *ptr = &Value; int **ptr_ptr = &ptr;
**ptr_ptr = Value2; printf("%d\n", *ptr); }
|
結論:
如果要將傳入的變數
內容改變,就要用傳址
呼叫
如果要將傳入的指標
內容改變,就要用雙重傳址
呼叫