-
程式 1 可以實現 a 和 b 值的交換,但程式 2 不能。 要理解這一點,您需要了解以下幾點:
1.變數的作用範圍; 區域性變數 (void swap(a,b) 在程式 2 子程式中,變數 a、b、k 都是區域性變數,生命週期從呼叫該函式開始,函式執行後變數被登出。
2、函式引數的傳遞方式; 上面的兩個子例程通過傳遞值來傳遞引數---將引數的值複製到引數中。 但是,子程式中表單引數的操作不會影響實際引數。
3.指標變數的含義; 指標變數是指向變數位址(整形器、浮點、字元等)位址的變數。 也就是說,指標變數的值是變數的位址。
如下分析: 程式1:表單引數呼叫子程式後,通過值傳遞獲取引數的值,表單引數和引數都儲存了同一變數的位址,並且在子程式中,表單引數的操作是間接對指向變數的,而不是表單引數本身的值。
可以更改 a 和 b 的值。
程式2:在子例程中,所有操作都是對引數本身的值執行的,執行完成後,引數(區域性變數)被登出。
過程 2:
-
是副本。 後乙個程式之所以不能實現交換,是因為 C C++ 函式引數傳遞了值(複製引數值的引數),所以函式中引數的運算不會影響對應的引數。
前乙個程式之所以能夠實現交換,是因為函式不對引數進行操作,而是對引數引用的記憶體進行操作,而引數引用的記憶體就是相應引數引用的記憶體。
-
主要是功能。
void swap(int a, int b)。 void swap(int *p1,int *p2),上乙個函式:只是將引數傳遞給引數,不返回(傳遞值)以下函式:
就是把引數的位址傳遞給引數,引數實際上在程式中操作引數的位址,所以位址下的值在程式中交換,也起到了交換的目的。
-
標準 C 中沒有引用,只能使用指標引數。
C++ 引入了指標引數來降低指標靈活性的風險,因為指標引數不僅可以將對資料的引用傳遞到函式中,還可以更改函式內的指標,即在函式內部更改呼叫域的變數(而不僅僅是物件)。
與引用相比,指標具有以下特徵:
指標變數可以重複賦值或更改(不適用於引用,一旦賦值,就無法更改),指標變數可以為空(指標必須指向特定物件)。
如果你不使用這些特性,覺得它們很麻煩,並且對非純C沒問題(即你不需要支援其他C的超集,如Objective-C),那麼使用引用引數,如果需要,甚至可以新增const以獲得進一步的約束。
-
C++ 不能將陣列直接傳遞給函式,但可以使用陣列名稱作為指向函式的陣列指標。
函式有三種接收指標的方法,int * 指標。
int [10] 固定長度陣列形式。
int 是乙個無限長的陣列。
以上三種效果是一樣的,都是接收指標,所以都是指標。 3 是引號。
需要注意的是,int a[10] 用作建立包含 10 個整數元素的陣列的定義。 但是,當用於表單引數時,它是用來接收整數指標的,並且對長度沒有嚴格的限制,並且在編譯時不會檢查。
例如,可以編譯以下程式並正常執行。
引數維度為 1
void fun(int p[1])
main()
int a[100];建立乙個包含 100 個元素的陣列,以確保 fun 函式不會越界。
fun(a);
cout <
-
第乙個是,第二個和第四個是一樣的,第三個是引用。 請同意!
-
第二個不是,其餘的都是。
-
fun (int a[10] ) 這個不是,其他一切都是。
若要通過傳遞函式來更改變數的值,必須傳遞位址。 您的程式正在傳遞變數 swap(a,b) 的值; 如果要更改變數的值,必須傳遞變數的位址,或者通過指標來傳遞,如果是陣列,可以直接使用陣列名稱,但如果是陣列的元素,則仍然需要使用位址。 就像樓上的那個改變他一樣。 >>>More
益山人參是山參的一種。 移山人參有兩種:“山遷徙”和“遷鄉”:“遷山”是指山農放山時,發現野山參苗由於體重小、人參年齡小而不適合使用,於是集中精力移植到家附近的山林中, 易於保護並使其自然生長;“居家遷徙”是指人參種植者將園內種植的人參幼苗移植到山林中,無需澆水施肥,使其在野外環境中自然生長。 >>>More
分配給引數的位址和引數是不同的。
如果不使用指標或引用,引數只能將某物(value)傳遞給引數,就像上面的例子一樣,帶有引數的事物可以複製並移動到引數中,引數中的事物(value)被更改但不會反向傳遞,即引數中的事物不會覆蓋引數的事物(值); >>>More