先描述乙個題目,題目是這樣的,輸入a和b兩個整數,按先大後小的順序輸出a和b。
/* note:your choice is c ide */
#include "stdio.h"
void main()
*p1
就是a
,是整型變數。而*temp
是指標變數temp
所指向的變數。但temp
中並無確定的值(它的值是不可預見的),因此temp
所指向的單元也是不可預見的。所以,對*temp
賦值有可能給乙個儲存著重要資料的儲存單元賦值,這樣就會破壞系統的正常工作狀況。應該將*p1
的值賦給乙個整型變數,用整型變數temp
作為臨時輔助變數實現*p1
和*p2
的交換。
考慮一下是否可以通過下面的函式實現a和b的互換:
void swap(int x,int y)
如果在main函式中呼叫swap函式:
swap(a,b);
在函式呼叫時,a
的值傳送給x
,b
的值傳送給y
。執行完swap函式後,x
和y
的值是互換了,但並未影響到a
和b
的值。在函式結束時,變數x
和y
釋放了,mian函式中的a
和b
並未互換。也就是說,由於「單向傳送」的「值傳遞」方式,形參值的改變不能使實參的值隨之改變。
為了使在函式中改變了的變數值能被main函式所用,不能採取上述把改變的值的變數作為引數的辦法,而應該用指標變數作為函式引數,在函式執行過程中使指標變數所指向的變數值發生變化,函式呼叫結束後,這些變數值的變化依然保留下來,這樣就實現了「通過呼叫函式是變數的值發生變化,在主調函式(如:main函式)中可以使用這些改變了的值」的目的。
請注意,不能企圖通過改變指標形參的值而使指標實參的值改變。下面的程式:
/* note:your choice is c ide */
#include "stdio.h"
void main()
{ void swap(int *p1,int *p2);
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a程式編寫者的意圖是:交換pointer_1和pointer_2
的值,使pointer_1
指向值大的變數。其設想是:
先使pointer_1
指向a
,pointer_2
指向b
。
呼叫swap函式,將pointer_1
的值傳給p1
,pointer_2
傳給p2
.
在swap函式中使p1
與p2
的值交換。
形參p1
、p2
將位址傳回實參pointer_1
和pointer_2
,使pointer_1
指向b
,pointer_2
指向a
。然後輸出*pointer_1
和*pointer_2
。
但是,這是辦不到的,結果並不會發生交換。問題出在第四步。c語言中實參變數和形參變數之間的資料傳遞時單向的「值傳遞」方式。指標變數作函式引數也要遵循這一規則。不可能通過呼叫函式來改變實參指標變數的值,但可以改變實參指標變數所指變數的值。我們知道,函式的呼叫可以(而且只可以)得到乙個返回值(即函式值),而運用指標變數作引數,可以得到多個變化了的值。如果不用指標變數是難以做到這一點的。
指標變數作為函式引數
函式的引數可以是指標型別,它的作用是將乙個變數的 位址傳送到另乙個函式中。指標變數作為函式引數與變數本身作函式引數不同,變數作函式引數傳遞的是具體值,而指標作函式引數傳遞的是記憶體的位址。用指標變數作函式引數,在被調函式的執行過程中,應使指標變數所指向的引數值發生變化,這樣,函式在呼叫結束後,其變化...
指標變數作為函式引數
先描述乙個題目,題目是這樣的,輸入a和b兩個整數,按先大後小的順序輸出a和b。note your choice is c ide include stdio.h void main void swap int p1,int p2 int a,b int pointer 1,pointer 2 sca...
C語言指標變數作為函式引數
有讀者反饋,不理解字元陣列和普通陣列的區別,下面筆者作一下解答。實際上,字元陣列和普通陣列一樣,沒有本質區別。請大家注意陣列型別的含義 資料型別指的是陣列所包含的元素的型別,而不是陣列名的型別,陣列名永遠是乙個指標,指向第乙個元素的位址,即陣列首位址。字元陣列的每個元素都是char型別,整型陣列的每...