Created
April 30, 2015 03:02
-
-
Save zlargon/f4eac4a82506273a98f3 to your computer and use it in GitHub Desktop.
C 指標基本觀念,function 總是 pass by value
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "stdio.h" | |
void setNumberTo10(int n) { | |
printf("\n%s:\n", __func__); | |
printf("n 記憶體位址 = %p, n 記憶體位址 size = %zu\n", &n, sizeof(&n)); | |
printf("n 記憶體空間的值 = %d, n 記憶體空間的 size = %zu\n", n, sizeof(n)); | |
n = 10; | |
printf("n = %d\n\n", n); | |
} | |
void setNumberTo456(int * n) { | |
printf("\n%s:\n", __func__); | |
printf("n 記憶體位址 = %p, n 記憶體位址 size = %zu\n", &n, sizeof(&n)); | |
printf("n 記憶體空間的值 = %p, n 記憶體空間的 size = %zu\n", n, sizeof(n)); | |
*n = 456; | |
printf("*n = %d\n\n", *n); | |
} | |
int main() { | |
// 1. 宣告 number | |
int number = 123; // 包含一個記憶體位址 + 實體記憶體空間 | |
printf("number 記憶體位址 = %p, number 記憶體位址 size = %zu\n", &number, sizeof(&number)); | |
printf("number 記憶體空間的值 = %d, number 記憶體空間的 size = %zu\n", number, sizeof(number)); | |
puts(""); | |
// 2-1. 宣告 ptr | |
int * ptr = NULL; // pointer 本身也有包含一個記憶體位址 + 實體記憶體空間, 但是 ptr 是一個專門存放記憶體位址的變數 | |
printf("ptr 記憶體位址 = %p, ptr 記憶體位址 size = %zu\n", &ptr, sizeof(&ptr)); | |
printf("ptr 記憶體空間的值 = %p, ptr 記憶體空間的 size = %zu\n", ptr, sizeof(ptr)); // NULL 即為 0 | |
puts(""); | |
// 2-2. ptr 是 NULL, 沒有指向實體的記憶體空間, 所以無法透過 * 運算子去尋訪 | |
// printf("*ptr = %d\n", *ptr); // 對 NULL 使用 * 運算子會 crash | |
// 3-1. 把 number 的記憶體位址 copy 一份給 ptr (NULL -> &number) | |
ptr = &number; | |
printf("ptr 記憶體位址 = %p, ptr 記憶體位址 size = %zu\n", &ptr, sizeof(&ptr)); | |
printf("ptr 記憶體空間的值 = %p, ptr 記憶體空間的 size = %zu\n", ptr, sizeof(ptr)); // 現在 ptr 存放的值, 即為 number 的記憶體位置 (同第 7 行) | |
puts(""); | |
// 3-2. 當把 number 的記憶體位址給 ptr 之後,就可以透過 * 運算子去尋訪 number 的記憶體空間的內容 | |
printf("number = %d\n\n", *ptr); // 同第 8 行 | |
// 4. copy '123' 到 setNumberTo10, 所以 function 裡面拿到的 n, 其實是 number 的副本 | |
setNumberTo10(number); | |
printf("number = %d (不變)\n\n", number); // function 回傳後,number 值不變 | |
// 5. copy number 的記憶體位址到 setNumberTo456, 所以 function 裡面拿到的 n, 其實是 number 記憶體位址的副本 | |
setNumberTo456(&number); // function 內部可以透過記憶體位置,去尋訪實體記憶體空間的內容,並且修改外部變數的內容 | |
printf("number = %d (改變)\n\n", number); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment