[C] const 和 pointer 使用的大亂鬥

[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 不知道幾天後大概就又忘了吧-___-“

179 Views


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *