指標變數作為函式引數

2021-07-14 09:48:30 字數 2149 閱讀 1536

先描述乙個題目,題目是這樣的,輸入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的值傳送給xb的值傳送給y。執行完swap函式後,xy的值是互換了,但並未影響到ab的值。在函式結束時,變數xy釋放了,mian函式中的ab並未互換。也就是說,由於「單向傳送」的「值傳遞」方式,形參值的改變不能使實參的值隨之改變。

為了使在函式中改變了的變數值能被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_1pointer_2的值,使pointer_1指向值大的變數。其設想是:

先使pointer_1指向apointer_2指向b

呼叫swap函式,將pointer_1的值傳給p1pointer_2傳給p2.

在swap函式中使p1p2的值交換。

形參p1p2將位址傳回實參pointer_1pointer_2,使pointer_1指向bpointer_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型別,整型陣列的每...