▌繼續昨天的問題,整合一下。
源代碼:
void function(int **get_a){
static int a;
*get_ptr = &a;
}
int main(){
int *get_a;
function(&get_a);
*get_a = 1;
return 0;
}
圖:
void function(int **get_a){
static int a;
*get_ptr = &a;
}
int main(){
int *get_a;
function(&get_a);
*get_a = 1;
return 0;
}
▌欸。
愚蠢細心的人類可能已經發現,
其實 函數的 get_a 的 第二層虛擬取值層級 並沒有被使用。
(即函數中沒有用到 **get_a )
其實 函數的 get_a 的 第二層虛擬取值層級 並沒有被使用。
(即函數中沒有用到 **get_a )
(話說 虛擬取值層級 這名字是我作出來的,事實上並沒有這玩意。
(所以我也不敢把它粗體,以免你們以為這是專業名詞。
▌那我可不可以把:
void function(int **get_a){
改成
void function(int *get_a){
呢?
當然是可以的,也不影響程序的行為。
不過編譯器會給你兩個警告。
( Visual Studio 2017 中 )
因為取值層級的不同,可能會導致非法存取。
在取值層級等於或小於的情況可能沒事,(像上面這個例子)
但是如果在...:
int *a;
function(&a)
void function(int ******get_a){
******get_a = 1; //非法存取! 不是允許存取的空間 或者是不存在
}
大於的情況會出事。
如果你在只允許 一層虛擬取值層級 的變數中使用 第二層虛擬取值層級 的話,
void function(int *get_a){
**get_a = 1; //錯誤
}
它會給你一個錯誤......
錯誤是不能編譯成功的,
警告是可以編譯成功的。
以我所知,虛擬取值層級是不會佔空間也不會影響效率的。
畢竟是虛擬的。
void function(int **get_a){
void function(int *get_a){
不過編譯器會給你兩個警告。
( Visual Studio 2017 中 )
因為取值層級的不同,可能會導致非法存取。
但是如果在...:
int *a;
function(&a)
void function(int ******get_a){
******get_a = 1; //非法存取! 不是允許存取的空間 或者是不存在
}
void function(int *get_a){
**get_a = 1; //錯誤
}
警告是可以編譯成功的。
畢竟是虛擬的。
▌但是哪種寫法比較好呢?
第一種寫法,可以讓編譯器不給出警告。
第二種寫法,可以給函數最小的存取權限,反正存取超出權限時,編譯器會給出錯誤。
我也不知道ww。
第二種寫法,可以給函數最小的存取權限,反正存取超出權限時,編譯器會給出錯誤。
我也不知道ww。
▌下一篇預告:
function(int **get_a)
可以換成 function(int *get_a)
。
反正只是純粹進行地址的儲存,又可不可以再換成
function(void *get_a)
呢? (int* -> void*)
竟然是不行的。 ∑(っ °Д °;)っ
下一篇再說。
三十天還真難呢,繼續拖一會指標好了。
function(int **get_a)
可以換成 function(int *get_a)
。反正只是純粹進行地址的儲存,又可不可以再換成
function(void *get_a)
呢? (int* -> void*)下一篇再說。
0 Comments
發佈留言