北一女中 資訊選手培訓營 妳不可不了解的指標 Nan
指標, 是一個神祕 而複雜的存在。
指標表示: 妳誤會我了啦 我很單純的′ ▽`)
變數 說到底…指標不過也就只是個…. int* int double float char * unsigned char … 長浮點數 記憶體位置, 目標是一個int 變數 int* 整數 double int float char * unsigned char …
5 int num = 5; int* ptr = # 做dereference: *ptr num 0xFFACBB00 叫我記憶體 0xFFACBB00 5 (4bytes) 變數名稱 變數型態 記憶體位置 num int 0xFFACBB00 … int* ptr = # 變數名稱 變數型態 記憶體位置 num int 0xFFACBB00 ptr int * 0xFF968C00 … 叫我記憶體 0xFF968C00 0xFFACBB00 做dereference: *ptr num
如果是指標的指標… int** ptr_ptr = &ptr; 做dereference: *ptr_ptr ptr 變數名稱 變數型態 記憶體位置 num int 0xFFACBB00 ptr int * 0xFF968C00 ptr_ptr int ** 0xFF9A8C04 叫我記憶體 0xFF9A8C04 0xFF968C00 做dereference: *ptr_ptr ptr
所以對指標做運算的意思是: 對記憶體位置做運算… int * ptr3 = ptr + 3; 3 * sizeof(int) + 變數名稱 變數型態 記憶體位置 num int 0xFFACBB00 ptr int * 0xFF968C00 ptr3 0xFF968C04 叫我記憶體 0xFF968C00 0xFFACBB00 = 0xFFACBB0C 叫我記憶體 0xFF968C04 0xFFACBB0C
陣列其實也是個指標… 不過不能改(const) int num[3]; num[0] = 5; num[2] = -10; 變數名稱 變數型態 記憶體位置 num int* const 0xFFACBB00 … num[2] *(num + 2) 叫我記憶體 0xFFACBB00 5 0xFFACBB04 0xFFACBB08 ? -10
5 ? -10 Q: printf(“%d”, ptr[1] ); A: -10 int* ptr = num + 1; 叫我記憶體 0xFFACBB00 5 ? -10 0xFFACBB04 0xFFACBB08 變數名稱 變數型態 記憶體位置 num const int* 0xFFACBB00 ptr int * 0xFF968C00 … int* ptr = num + 1; 叫我記憶體 0xFF968C00 0xFFACBB04 Q: printf(“%d”, ptr[1] ); A: -10
練習時間! 這樣會輸出什麼呢? char str[] = “hello world”; char *ptr = str + 3; printf(“%s\n”, ptr ); printf(“%c\n”, ptr[2]); 這樣會輸出什麼呢?
現在,有沒有覺得指標不再是一團迷霧了呢?
再多講一點點: 結構(structure)!
結構的語法大概長這樣… struct STURCT_NAME{ TYPE FIELD_NAME; … }; int main(){ //…
struct student *ptr = &me; me.id = 5; me.weight = 57.0; int id; double weight; double height; }; int main(){ struct student me; struct student *ptr = &me; me.id = 5; me.weight = 57.0; me.height = 166.5; printf(“%d, %.2lf, %.2lf\n”, ptr->id, ptr->weight, ptr->height); }; 如果是變數本身要存取 用點點 如果要透過指標存取 用箭號-> ptr->id的效力 等同於(*ptr).id