指針變量做爲函數參數(轉貼)

指針變量做爲函數參數 函數的參數不只能夠是整型、實型、字符型等數據,還能夠是指針類型。它的做用是將一個變量的地址傳送到另外一個函數中。 【例10.3】題目同例10.2,即輸入的兩個整數按大小順序輸出。今用函數處理,並且用指針類型的數據做函數參數。 swap(int *p1,int *p2) {int temp; temp=*p1; *p1=*p2; *p2=temp; } main() { int a,b; int *pointer_1,*pointer_2;   scanf("%d,%d",&a,&b);   pointer_1=&a;pointer_2=&b;   if(a<b) swap(pointer_1,pointer_2);   printf("\n%d,%d\n",a,b);   }    對程序的說明: swap是用戶定義的函數,它的做用是交換兩個變量(a和b)的值。swap函數的形參p一、p2是指針變量。程序運行時,先執行main函數,輸入a和 b的值。而後將a和b的地址分別賦給指針變量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。 接着執行if語句,因爲a〈b,所以執行swap函數。注意實參pointer_1和pointer_2是指針變量,在函數調用時,將實參變量的值傳遞給 形參變量。採起的依然是「值傳遞」方式。所以虛實結合後形參p1的值爲&a,p2的值爲&b。這時p1和pointer_1指向變量a, p2和pointer_2指向變量b。 接着執行執行swap函數的函數體使*p1和*p2的值互換,也就是使a和b的值互換。 函數調用結束後,p1和p2不復存在(已釋放)如圖。 最後在main函數中輸出的a和b的值是已通過交換的值。 請注意交換*p1和*p2的值是如何實現的。請找出下列程序段的錯誤: swap(int *p1,int *p2) {int *temp; *temp=*p1;      /*此語句有問題*/ *p1=*p2; *p2=temp; } 請考慮下面的函數可否實現實現a和b互換。 swap(int x,int y) {int temp; temp=x; x=y; y=temp; } 若是在main函數中用「swap(a,b);」調用swap函數,會有什麼結果呢?請看下圖所示。 【例10.4】請注意,不能企圖經過改變指針形參的值而使指針實參的值改變。 swap(int *p1,int *p2) {int *p; p=p1; p1=p2; p2=p; } main() { int a,b; int *pointer_1,*pointer_2;   scanf("%d,%d",&a,&b);   pointer_1=&a;pointer_2=&b;   if(a<b) swap(pointer_1,pointer_2);   printf("\n%d,%d\n",*pointer_1,*pointer_2);   }    其中的問題在於不能實現如圖所示的第四步(d)。 【例10.5】輸入a、b、c3個整數,按大小順序輸出。 swap(int *pt1,int *pt2) {int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; } exchange(int *q1,int *q2,int *q3) { if(*q1<*q2)swap(q1,q2); if(*q1<*q3)swap(q1,q3); if(*q2<*q3)swap(q2,q3); } main() { int a,b,c,*p1,*p2,*p3;   scanf("%d,%d,%d",&a,&b,&c);   p1=&a;p2=&b; p3=&c;   exchange(p1,p2,p3);   printf("\n%d,%d,%d \n",a,b,c);   }    10.2.4        指針變量幾個問題的進一步說明 指針變量能夠進行某些運算,但其運算的種類是有限的。它只能進行賦值運算和部分算術運算及關係運算。 1.        指針運算符 1)        取地址運算符&:取地址運算符&是單目運算符,其結合性爲自右至左,其功能是取變量的地址。在scanf函數及前面介紹指針變量賦值中,咱們已經瞭解並使用了&運算符。 2)        取內容運算符*:取內容運算符*是單目運算符,其結合性爲自右至左,用來表示指針變量所指的變量。在*運算符以後跟的變量必須是指針變量。 須要注意的是指針運算符*和指針變量說明中的指針說明符*不是一回事。在指針變量說明中,「*」是類型說明符,表示其後的變量是指針類型。而表達式中出現的「*」則是一個運算符用以表示指針變量所指的變量。 【例10.6】 main(){   int a=5,*p=&a;   printf ("%d",*p); }        表示指針變量p取得了整型變量a的地址。printf("%d",*p)語句表示輸出變量a的值。 2.        指針變量的運算 1)        賦值運算:指針變量的賦值運算有如下幾種形式。 ①        指針變量初始化賦值,前面已做介紹。 ②        把一個變量的地址賦予指向相同數據類型的指針變量。 例如: int a,*pa; pa=&a;    /*把整型變量a的地址賦予整型指針變量pa*/ ③        把一個指針變量的值賦予指向相同類型變量的另外一個指針變量。 如:     int a,*pa=&a,*pb;     pb=pa;    /*把a的地址賦予指針變量pb*/ 因爲pa,pb均爲指向整型變量的指針變量,所以能夠相互賦值。 ④        把數組的首地址賦予指向數組的指針變量。 例如:     int a[5],*pa;     pa=a;     (數組名錶示數組的首地址,故可賦予指向數組的指針變量pa) 也可寫爲:     pa=&a[0];  /*數組第一個元素的地址也是整個數組的首地址,              也可賦予pa*/ 固然也可採起初始化賦值的方法:     int a[5],*pa=a; ⑤        把字符串的首地址賦予指向字符類型的指針變量。 例如:     char *pc;     pc="C Language"; 或用初始化賦值的方法寫爲:     char *pc="C Language"; 這裏應說明的是並非把整個字符串裝入指針變量,而是把存放該字符串的字符數組的首地址裝入指針變量。在後面還將詳細介紹。 ⑥        把函數的入口地址賦予指向函數的指針變量。 例如:     int (*pf)();     pf=f;     /*f爲函數名*/ 2)        加減算術運算     對於指向數組的指針變量,能夠加上或減去一個整數n。設pa是指向數組a的指針變量,則pa+n,pa-n,pa++,++pa,pa--,--pa運算 都是合法的。指針變量加或減一個整數n的意義是把指針指向的當前位置(指向某數組元素)向前或向後移動n個位置。應該注意,數組指針變量向前或向後移動一 個位置和地址加1或減1在概念上是不一樣的。由於數組能夠有不一樣的類型,各類類型的數組元素所佔的字節長度是不一樣的。如指針變量加1,即向後移動1 個位置表示指針變量指向下一個數據元素的首地址。而不是在原地址基礎上加1。例如:     int a[5],*pa;     pa=a;      /*pa指向數組a,也是指向a[0]*/ pa=pa+2;   /*pa指向a[2],即pa的值爲&pa[2]*/ 指針變量的加減運算只能對數組指針變量進行,對指向其它類型變量的指針變量做加減運算是毫無心義的。 3)        兩個指針變量之間的運算:只有指向同一數組的兩個指針變量之間才能進行運算,不然運算毫無心義。 ①        兩指針變量相減:兩指針變量相減所得之差是兩個指針所指數組元素之間相差的元素個數。其實是兩個指針值(地址)相減之差再除以該數組元素的長度(字節 數)。例如pf1和pf2是指向同一浮點數組的兩個指針變量,設pf1的值爲2010H,pf2的值爲2000H,而浮點數組每一個元素佔4個字節,因此 pf1-pf2的結果爲(2000H-2010H)/4=4,表示pf1和 pf2之間相差4個元素。兩個指針變量不能進行加法運算。 例如,pf1+pf2是什麼意思呢?毫無實際意義。 ②        兩指針變量進行關係運算:指向同一數組的兩指針變量進行關係運算可表示它們所指數組元素之間的關係。 例如: pf1==pf2表示pf1和pf2指向同一數組元素; pf1>pf2表示pf1處於高地址位置; pf1<pf2表示pf2處於低地址位置。 指針變量還能夠與0比較。 設p爲指針變量,則p==0代表p是空指針,它不指向任何變量; p!=0表示p不是空指針。 空指針是由對指針變量賦予0值而獲得的。 例如: #define NULL 0 int *p=NULL; 對指針變量賦0值和不賦值是不一樣的。指針變量未賦值時,能夠是任意值,是不能使用的。不然將形成意外錯誤。而指針變量賦0值後,則可使用,只是它不指向具體的變量而已。 【例10.7】 main(){   int a=10,b=20,s,t,*pa,*pb; /*說明pa,pb爲整型指針變量*/   pa=&a;                     /*給指針變量pa賦值,pa指向變量a*/   pb=&b;                     /*給指針變量pb賦值,pb指向變量b*/   s=*pa+*pb;                 /*求a+b之和,(*pa就是a,*pb就是b)*/   t=*pa**pb;                 /*本行是求a*b之積*/   printf("a=%d\nb=%d\na+b=%d\na*b=%d\n",a,b,a+b,a*b);   printf("s=%d\nt=%d\n",s,t); } 【例10.8】 main(){   int a,b,c,*pmax,*pmin;             /*pmax,pmin爲整型指針變量*/   printf("input three numbers:\n");  /*輸入提示*/   scanf("%d%d%d",&a,&b,&c);         /*輸入三個數字*/   if(a>b){                          /*若是第一個數字大於第二個數字...*/     pmax=&a;                        /*指針變量賦值*/     pmin=&b;}                       /*指針變量賦值*/   else{     pmax=&b;                        /*指針變量賦值*/     pmin=&a;}                       /*指針變量賦值*/   if(c>*pmax) pmax=&c;              /*判斷並賦值*/   if(c<*pmin) pmin=&c;              /*判斷並賦值*/     printf("max=%d\nmin=%d\n",*pmax,*pmin); /*輸出結果*/ } 10.3        數組指針和指向數組的指針變量 一個變量有一個地址,一個數組包含若干元素,每一個數組元素都在內存中佔用存儲單元,它們都有相應的地址。所謂數組的指針是指數組的起始地址,數組元素的指針是數組元素的地址。
相關文章
相關標籤/搜索