[C] const 和 pointer 使用的大亂鬥
最近在看C的書,發現幾個問題很有趣,網路上文章眾說紛紜,
最後還是自己寫一個程式來測試最準確囉~
果真有很 “意外” 的收穫 🙂
const 這個修飾詞沒有很明確的定義,就像網路上的文章大多也不敢對他定義。
因為他的用法有點詭譎,只能是一種象徵的意味…
用我的理解他就像是一個限制器,
當你把他加在你的變數前面以後,這個變數就不能再更改了。
用const把一個變數定義為一個”常數” “不能更改的數值”
然後有趣拉,面試最愛考的pointer 和 const完美結合,
變成複雜到不行的大亂鬥。
有這三個情況…實在很難用言語形容他們,只好寫程式實驗驗證一下…
1.const int *ptr
這代表 ptr 是一個const int型態的指標,所以他的型態是cosnt int,代表這個指標指到的東西不能改了。
你不能(*ptr)++,也不能*ptr = 10;
2.int *const ptr
這整個指標是一個const ptr,我試著把他理解成int *(const ptr) 所以就像是這個指標不能改=這指標不能移動,
你不能ptr++ 也不能ptr = ?
3.int const *ptr
這最怪了,我以為他跟2應該是一樣的,結果他竟然是跟1一樣!!!
所以這也是代表指標指到的東西不能改,
不能(*ptr)++,也不能*ptr = 10;
#include <stdio.h> int main(void){ int var = 10; //int * const ptr = &var; //int const * ptr = &var; const int *ptr = &var; printf("wellytest begin var = %d\n", var); printf("wellytest begin var = %d\n", *ptr); //*ptr = 12; //改裡面的值 //(*ptr)++; //改裡面的值 ptr++; //改整個ptr的address printf("wellytest begin var = %d\n", var); printf("wellytest begin var = %d\n", *ptr); return 0; }
為了追求更準確的答案,只用GCC來build
gcc -o testreult wellytest.c
這真的是很難…Orzzzz 不知道幾天後大概就又忘了吧-___-“
341 Views