天天看點

Letter Combinations of a Phone Number

各位先看一下下面的題目,看看能否給出答案以及真正了解原因。

問題1的答案:z=1,,對于這個答案,相信很多人都不會答錯,都知道a和b沒有發生交換。但是了解其中的原因嗎?

swap(int a,int b)是一個參數傳值得函數,這就意味着函數體内的a和b是參數int a和int b的實參在函數内的 一份局部拷貝,是以a和b實際可以看成是局部變量,它們的值是由int a和int b傳的實參複制而來的。函數内a和b的值得改變隻在函數體内部有效,當函數體内的a和b變量離開函數作用域的時候,a和b變量就被銷毀了。函數的實參值并沒有發生改變,或者說自始至終沒有改變過,改變的隻是它們在函數體内的一份局部拷貝a和b。

問題2的答案:z=2

int get_int(int a)屬于傳回值是傳值的函數,這就意味着函數int get_int(int a)會在函數傳回處産生一個臨時對象,使用者存放局部變量i的值的一份拷貝(變量i的右值的拷貝),臨時對象是沒有名稱的,這份沒有名稱的對象的值(右值)會存儲在調用者的“棧”中。是以當i作為局部變量離開作用域後,雖然被銷毀了,但它的拷貝仍然存在,并在函數傳回時作為“右值”賦給“左值z”。

問題3的答案:c0=“ hello world”

函數傳回的是指向“堆”記憶體的在指針。程式中malloc()是用于配置設定“堆”記憶體的庫函數,而對于“堆”記憶體,隻要程式中沒有調用free()庫函數去釋放該“堆”記憶體,那麼在程式運作期間,malloc()庫函數配置設定的“堆”記憶體将一直存在。char* get_memory0()會在函數傳回處産生一個隊傳回變量p的“左值”的拷貝,也就是在“左值”的拷貝中存儲了指向“堆”的位址。作為局部變量的p,在離開了函數作用域的時候,雖然被銷毀了,但函數傳回的“左值”的拷貝是存在的,該拷貝存儲了指向“堆”的位址,而該“堆”的值是“hello

world”。

問題4的答案:c1="hello world"

在char* p = “hello world”中,左值是 局部指針變量p,存儲于函數棧上,右值是字元串常量“hello world”,存儲于常量存儲區。

char* get_memory 1()屬于傳回值是傳指針的函數,這就意味着函數char* get_memory 1()會在函數傳回處産生一個對傳回對象的“左值”的拷貝,也就是在“左值”拷貝中存儲了指向字元串常量“hello world”的位址。作為局部變量的p,在離開函數作用域的時候雖然被銷毀了,但 函數傳回的“左值“拷貝仍然存儲了指向常量存儲區的字元串常量”hello world“的位址。

問題5的答案:c2=未知

傳回值是傳指針,會在函數傳回時産生”左值“拷貝。

 函數傳回的”左值“拷貝指向的是局部變量數組p[12]的首位址。當局部數組p[12]離開作用域後會被自動銷毀。這時,函數傳回的”左值“拷貝指向的是一個被銷毀的局部變量位址。

繼續閱讀