Skip to content

Instantly share code, notes, and snippets.

@zlargon
Created April 30, 2015 03:02
Show Gist options
  • Save zlargon/f4eac4a82506273a98f3 to your computer and use it in GitHub Desktop.
Save zlargon/f4eac4a82506273a98f3 to your computer and use it in GitHub Desktop.
C 指標基本觀念,function 總是 pass by value
#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