1. 程式人生 > >形參與實參之間的值傳遞

形參與實參之間的值傳遞

先說形參與實參的數值傳遞:

       函式呼叫時將實引數傳遞給形參稱為引數傳遞。C語言中,引數的傳遞方式是“單向值傳遞”,形參和實參變數各自有不同的儲存單元,被呼叫函式中的形參變數值的變化不會影響實參變數值。

舉個例子 

#include<stdio.h>

 void   swap(int x,int y)

 {

     int z;

      z=x;         x=y;       y=z;

}

woid main()

{

      int a,b;

      a=10;    b=20;

      swap(a,b);

      printf("a=%d\tb=%d\n",a,b);

}

執行結果:

a=10    b=20

         在呼叫swap()函式時,實參a 和b的值是10和20.進入被調函式時,先開闢形參單元x和y,再將a和b的值分別傳遞給形參變數x和y,執行swap()函式使x和y的值進行交換,但是交換的結果並不會使實參變數a和b交換,所以a和b的值仍為10和20。引數的傳遞方式是“單向值傳遞”。主要的解釋就是:形參和實參變數各自有不同的儲存單元,實參有一個儲存空間,行參有一個儲存空間,將實參單值傳遞給形參,在形參的儲存空間裡進行的運算,但是這種運算不會對實參的儲存空間產生影響。

       但是也有例外的情況,就是在陣列作為函式引數時。

       一個變數有地址,一個數組包含若干個元素,每個陣列元素都在記憶體中佔用儲存單元,他們都有相應的地址。既然指標可以指向變數,也就意味著它也可以指向陣列元素,即把某個元素的地址放到一個指標變數中。所以所謂陣列元素的指標就是陣列元素的地址。定義一個有10個元素的整形陣列,int  a[10];    定義一個指向整形變數的指標變數,int *p;     若p=&a[0]或p=a;    則代表將a[0]元素的地址賦給了指標變數p。其中值得注意的是a代表的不是整個陣列,而是代表陣列名,C中規定陣列名代表把陣列中第一個元素的地址,因此a等同與&a[0];只是形式上的不同而已。在明白了基礎概念之後,我們進一不看看陣列名和指向陣列的指標變數的應用。

            將陣列名作為函式引數的時候,在實參和形參之間的對應關係有以下四種:

1.形參和實參都用陣列名,如

main()                                          f(int x[].int n)

{int a[10];                                       {

……                                                ……

f(a,10);                                          }

}

由於形引數組名接受了實引數組首元素的地址,因此在函式呼叫期間,形引數組與實引數組共用一段記憶體空間。

2.實參用陣列名,形參用指標變數,如

main()                                    f(int *x,int n)

{int a[10];                               {

……                                        ……

f(a,10);                                     }

}

x為指向整形變數的指標變數,函式開始執行是x指向a[0],通過x值的變化,可以指向a陣列的任一元素。

3.實參形參都用指標變數,如

main()                                  f(int *x,int n)

{int a[10];  ,*p;                   {

p=a;   ……                              ……

f(p,10);                                }

}

實參p和形參x都是指標變數,p先指向陣列a,即p的值就是&a[0],然後將p的值傳遞給x,x的值也是&a[0],因此通過x的改變就可使x指向a的任一元素。

4.實參為指標變數,形參為陣列名,如

main()                              f(int x[],int n)

{int a[10],*p;                     {

p=a;……                            ……

f(p,10);                              }

}

實參p為指標變數,它指向a[0],形參為陣列名x,但在C中將它做為指標變數來處理,所以a[0]的值也傳給了x,因此也可以理解為形引數組x和a陣列共用同一段記憶體單元。

以上內容想說明陣列的傳遞和指標在陣列中的應用,旨在說明第一種情況,注意紅字,下面將進一步說明

陣列名作函式的引數,必須遵循以下原則:
(1)如果形參是陣列形式,則實參必須是實際的陣列名,如果實參是陣列名,則形參可以是同樣維數的陣列名或指標。
(2)要在主調函式和被調函式中分別定義陣列。
(3)實引數組和形引數組必須型別相同,形引數組可以不指明長度。
(4)在C語言中,陣列名除作為變數的識別符號之外,陣列名還代表了該陣列在記憶體中的起始地址,因此,當陣列名作函式引數時,實參與形參之間不是"值傳遞",而是"地址傳遞",實引數組名將該陣列的起始地址傳遞給形引數組,兩個陣列共享一段記憶體單元,編譯系統不再為形引數組分配儲存單元。
例9-15:分析程式的執行過程。
#include <stdio.h>
func6 ( char str[ ] )
{ printf ("%s",str);
}
main( )
{ char a[10]= "Turbo C";
func6(a); /* 陣列名做函式的實參 */
}
記憶體空間儲存狀態如9-5圖所示。

呼叫時,實引數組將首地址a 賦值給形引數組str,兩個陣列共同佔用相同的記憶體單元,共享陣列中的資料,a[0]與str[0]代表同一個元素,a[1]與str[1]代表同一個元素。因此,當陣列名做函式引數時,形引數組的長度與實引數組的長度可以不相同,當形引數組長度小與實引數組長度時,形引數組只取部分實引數組中的資料,實參中的其餘部分可以不起作用,形引數組也可以不指明長度。

相關推薦

參與之間傳遞

先說形參與實參的數值傳遞:        函式呼叫時將實引數傳遞給形參稱為引數傳遞。C語言中,引數的傳遞方式是“單向值傳遞”,形參和實參變數各自有不同的儲存單元,被呼叫函式中的形參變數值的變化不會影響實參變數值。 舉個例子  #include<stdio.h&

C++ 參與傳遞

函式呼叫形參、實參的問題 函式呼叫時,引數分兩種 一種是送進去的引數,一種是想從裡面得到的引數。比如: ExternalRectangle((unsigned char*)(frame->imageData), ObjInfo,widthstep,alarm_flag

C#傳遞引數,引用傳遞引數,輸出引數,引數陣列的學習

1)形參 形參顧名思義就是形式上的引數,不是實際的引數,它代替實際傳入方法的值。在方法體程式碼中代表了值本身參與運算。形參定義於引數中,它不同於方法體內區域性變數,因為是一個變數,在它的作用域內不允許存在一個同名的區域性變數,不管他們的型別是否相同,都是不允許出現同名的

關於參與

tro logs ios clas ron ret turn 參與 輸出結果 #include<iostream> using namespace std; void updateStruct(int number) { number++; }

Pyhton函數篇(一)之函數中的參與

依然 tell 多個 存在 默認 urn 字符串 div 地址 1:什麽是函數   函數其實就是帶名字的代碼塊,用於完成一些具體的工作。如果我們在寫一段程序的時候,需要多次用到同樣的一個功能,如果每次都要重復寫相同的代碼,不僅會增加我們的代碼量,更會讓我們寫出的代碼讓別人看

java中的參與

目的 ont nbsp 基礎 引用 很多 java size ava 看了很多的文章,稍微有一些的總結;對最基本的形參與實參有了一定的理解,雖然還是不夠深入。 1、基本概念 形參:全稱為"形式參數"是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳如的參

c語言中參與的關係

形參和實參的區別 形參出現在函式定義中,在整個函式體內都可以使用, 離開該函式則不能使用。 實參出現在主調函式中,進入被調函式後,實參變數也不能使用。  形參和實參的功能是作資料傳送。發生函式呼叫時, 主調函式把實參的值傳送給被調函式的形參從而實現主調函式向被調函式的資料傳送。 1

關於Java中參與的理解

今天閱讀了一個寫的非常棒的博文,通過此博文再次複習了Java中引數傳遞的知識(即值傳遞與引用傳遞的區別)。參考網站http://www.cnblogs.com/binyue/p/3862276.html。下面我將通過次博文記錄自己的理解,還望能夠幫助再學Java或者複習Java的朋友們。 理解J

Java 參與

轉自:https://dailycast.github.io/Java-形參與實參/ 前幾天在頭條上看到一道經典面試題,引發了一些思考。也是寫這篇文章的導火索。 背景 請看題: public class Main { public static void

計算機二級-C語言-對二維數組數據進行處理。對文件進行數據輸入。參與

元素 首地址 clu 重難點 style 賦值 是否 code *** //函數fun的功能為:計算x所指數組中N個數的平均值(規定所有數都為正數),平均值通過形參返回給主函數,將小於平均值且最接近平均值的數作為函數值返回,並輸出。 //重難點:形參與實參之間,是否進行了值

const 修飾參與

最好將const看做引數的一部分,形參和實參保持一致,下面舉個例子來說明形參與實參在const修飾不一致的情況下什麼時候會出錯,什麼時候不會出錯,以及其中的原因。 #include <iostream> using namespace std; void str

參與(1)------函式參與區域性變數在記憶體中的處理

首先,實現一個“交換兩個整形變數的值”的函式。由結果可知,這樣做並不能真正完成交換資料,手工分析如下:由上圖可見,Exchange()函式並沒有更改main()函式中num1和num2的值。在記憶體中的解釋如下:解釋:先將主函式中的變數入棧(這個棧,指的是:作業系統記憶體管理

函式呼叫時的參與

    大多數人在進行學習程式設計時,對於函式呼叫時函式時的傳遞的內容是一個頭大的問題。本人在學習後有了以下的見解請大家共同學習,若有失誤,請指出!基礎知識1.系統堆疊(即棧區域)和堆區域。        1.1、棧(Stack)是作業系統在建立某個程序時或者執行緒(在支援多

Javascript函式參與

形參,是在定義函式時使用的引數,目的是用來接收呼叫該函式時傳進來的實際引數。 實參:是在呼叫時傳遞給函式的引數 例如 function myfun(a,b,c){ ... } myfun(1,2,3); 這裡a,b,c就是形參。1,2,3為實

大歐陽在java 參與還有傳遞和引用傳遞之間的理解

一、實參和形參先扯一段程式碼public static void swap(int a,int b) { int tmp = a; a = b; b = tmp; System.out.println("

【Java思考】Java 中的參與之間傳遞到底是傳遞還是引用傳遞呢?

科普: - **值傳遞**(pass by value)是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。 - **引用傳遞**(pass by reference)是指在呼叫函式時將實際引數的地址直接傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實

函式之間傳遞

      實參可以是常量,變數或表示式。       實參與形參的型別應相同或賦值相容。      在呼叫函式過程中發生的實參與形參間的資料傳遞,常稱為“虛實結合” 1.在定義函式中制定的形參,在沒有出現函式呼叫時,它們不佔記憶體中的儲存單元。在發生函式呼叫時,函式的形參

C語言函式傳遞的變化不會改變

如題,C語言在函式間傳遞引數時,形參的變化是不會改變實參的值的!!! 如: include<stdio.h> void main(){   void swap(int,int);   int a,b;   scanf("%d,%d",&a,&b)

C++ char* 的若干問題之二:char*作為能否影響

有如下方法: int readFeat(char* param) { param = (char *) malloc(10 * sizeof(char)); param = "test char"; param = '\0'; return 0; } 在該方法中,

java 傳遞和引用傳遞

分析java 函式引數傳遞的型別. 首先看示例: //定義一個受測試的類 public static class Value { private String value = "value"; public String getValue() {