導航:首頁 > 源碼編譯 > 編譯系統會根據形參的

編譯系統會根據形參的

發布時間:2022-09-24 08:03:49

❶ 實參形參~

在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組並不存在,編譯系統不為形參數組分配內存。那麼,數據的傳送是如何實現的呢? 我們知道,數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送, 也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之後,也就等於有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。例如:設a為實參數組,類型為整型。a佔有以2000 為首地址的一塊內存區。b為形參數組名。當發生函數調用時,進行地址傳送, 把實參數 組a的首地址傳送給形參數組名b,於是b也取得該地址2000。 於是a,b兩數組共同佔有以2000 為首地址的一段連續內存單元。a和b下標相同的元素實際上也占相同的兩個內存單元(整型數組每個元素佔二位元組)。例如a[0]和b[0]都佔用2000和2001單元,當然a[0]等於b[0]。類推則有a[i]等於b[i]。

❷ c語言中用函數做參數怎麼用

數組元素就是下標變數,它與普通變數並無區別。 因此它作為函數實參使用與普通變數是完全相同的,在發生函數調用時,把作為實參的數組元素的值傳送給形參,實現單向的值傳送。【例5-4】說明了這種情況。

【例8-7】判別一個整數數組中各元素的值,若大於0 則輸出該值,若小於等於0則輸出0值。編程如下:#include <stdio.h>void nzp(int v){ if(v>0) printf("%d ",v); else printf("%d ",0);}int main(void){ int a[5],i; printf("input 5 numbers\n"); for(i=0;i<5;i++){ scanf("%d",&a[i]); nzp(a[i]); } return 0;}
本程序中首先定義一個無返回值函數nzp,並說明其形參v為整型變數。在函數體中根據v值輸出相應的結果。在main函數中用一個for語句輸入數組各元素,每輸入一個就以該元素作實參調用一次nzp函數,即把a[i]的值傳送給形參v,供nzp函數使用。

數組名作為函數參數
用數組名作函數參數與用數組元素作實參有幾點不同。

1) 用數組元素作實參時,只要數組類型和函數的形參變數的類型一致,那麼作為下標變數的數組元素的類型也和函數形參變數的類型是一致的。因此,並不要求函數的形參也是下標變數。換句話說,對數組元素的處理是按普通變數對待的。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。當形參和實參二者不一致時,即會發生錯誤。

2) 在普通變數或下標變數作函數參數時,形參變數和實參變數是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送是把實參變數的值賦予形參變數。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組並不存在,編譯系統不為形參數組分配內存。那麼,數據的傳送是如何實現的呢?在我們曾介紹過,數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之後,也就等於有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。

上圖說明了這種情形。圖中設a為實參數組,類型為整型。a佔有以2000為首地址的一塊內存區。b為形參數組名。當發生函數調用時,進行地址傳送,把實參數組a的首地址傳送給形參數組名b,於是b也取得該地址2000。於是a,b兩數組共同佔有以2000為首地址的一段連續內存單元。從圖中還可以看出a和b下標相同的元素實際上也占相同的兩個內存單元(整型數組每個元素佔二位元組)。例如a[0]和b[0]都佔用2000和2001單元,當然a[0]等於b[0]。類推則有a[i]等於b[i]。

【例8-8】數組a中存放了一個學生5門課程的成績,求平均成績。#include <stdio.h>float aver(float a[5]){ int i; float av,s=a[0]; for(i=1;i<5;i++) s=s+a[i]; av=s/5; return av;}int main(void){ float sco[5],av; int i; printf("\ninput 5 scores:\n"); for(i=0;i<5;i++) scanf("%f",&sco[i]); av=aver(sco); printf("average score is %5.2f",av); return 0;}
本程序首先定義了一個實型函數aver,有一個形參為實型數組a,長度為5。在函數aver中,把各元素值相加求出平均值,返回給主函數。主函數main 中首先完成數組sco的輸入,然後以sco作為實參調用aver函數,函數返回值送av,最後輸出av值。 從運行情況可以看出,程序實現了所要求的功能。

3) 前面已經討論過,在變數作函數參數時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,兩者的終值是不同的。而當用數組名作函數參數時,情況則不同。由於實際上形參和實參為同一數組,因此當形參數組發生變化時,實參數組也隨之變化。當然這種情況不能理解為發生了「雙向」的值傳遞。但從實際情況來看,調用函數之後實參數組的值將由於形參數組值的變化而變化。為了說明這種情況,把【例5.4】改為【例5.6】的形式。

【例8-9】題目同【例8.7】。改用數組名作函數參數。#include <stdio.h>void nzp(int a[5]){ int i; printf("\nvalues of array a are:\n"); for(i=0;i<5;i++){ if(a[i]<0) a[i]=0; printf("%d ",a[i]); }}int main(void){ int b[5],i; printf("\ninput 5 numbers:\n"); for(i=0;i<5;i++) scanf("%d",&b[i]); printf("initial values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); nzp(b); printf("\nlast values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); return 0;}
本程序中函數nzp的形參為整數組a,長度為5。主函數中實參數組b也為整型,長度也為5。在主函數中首先輸入數組b的值,然後輸出數組b的初始值。然後以數組名b為實參調用nzp函數。在nzp中,按要求把負值單元清0,並輸出形參數組a的值。 返回主函數之後,再次輸出數組b的值。從運行結果可以看出,數組b的初值和終值是不同的,數組b的終值和數組a是相同的。這說明實參形參為同一數組,它們的值同時得以改變。

用數組名作為函數參數時還應注意以下幾點:
①形參數組和實參數組的類型必須一致,否則將引起錯誤。

②形參數組和實參數組的長度可以不相同,因為在調用時,只傳送首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖不至於出現語法錯誤(編譯能通過),但程序執行結果將與實際不符,這是應予以注意的。

【例8.10】如把例8.9修改如下:#include <stdio.h>void nzp(int a[8]){ int i; printf("\nvalues of array aare:\n"); for(i=0;i<8;i++){ if(a[i]<0)a[i]=0; printf("%d ",a[i]); }}int main(void){ int b[5],i; printf("\ninput 5 numbers:\n"); for(i=0;i<5;i++) scanf("%d",&b[i]); printf("initial values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); nzp(b); printf("\nlast values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); return 0;}
本程序與【例8.9】程序比,nzp函數的形參數組長度改為8,函數體中,for語句的循環條件也改為i<8。因此,形參數組a和實參數組b的長度不一致。編譯能夠通過,但從結果看,數組a的元素a[5]、a[6]、a[7]顯然是無意義的。

③在函數形參表中,允許不給出形參數組的長度,或用一個變數來表示數組元素的個數。例如,可以寫為:
void nzp(int a[])
或寫為
void nzp( int a[], int n )
其中形參數組a沒有給出長度,而由n值動態地表示數組的長度。n的值由主調函數的實參進行傳送。由此,【例8-10】又可改為【例8-11】的形式。

【例8-11】復制純文本新窗口
#include <stdio.h>void nzp(int a[],int n){ int i; printf("\nvalues of array a are:\n"); for(i=0;i<n;i++){ if(a[i]<0) a[i]=0; printf("%d ",a[i]); }}int main(void){ int b[5],i; printf("\ninput 5 numbers:\n"); for(i=0;i<5;i++) scanf("%d",&b[i]); printf("initial values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); nzp(b,5); printf("\nlast values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); return 0;}

❸ 為什麼數組只能做函數實參而不能做函數形參

可以的啊。
如果你認為void func(int a[])這樣的形參不是數組,那麼作為實參的時候的數組名也不能稱之為數組了,因為它實際上只表示第一個元素的地址而已,根本不表示整個數組。因此,如果老師講「數組只能做函數實參而不能做函數形參」那是不負責任的。

❹ c語言中形參和實參的區別

函數的形參和實參區別如下:
1. 形參變數只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。函數調用結束返回主調函數後則不能再使用該形參變數。
2. 實參可以是常量、變數、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使實參獲得確定值。
3. 實參和形參在數量上,類型上,順序上應嚴格一致,否則會發生類型不匹配」的錯誤。
4. 函數調用中發生的數據傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數調用過程中,形參的值發生改變,而實參中的值不會變化。
實參(argument):
全稱為"實際參數"是在調用時傳遞給函數的參數. 實參可以是常量、變數、表達式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。
形參(parameter):

全稱為"形式參數" 由於它不是實際存在變數,所以又稱虛擬變數。是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳入的參數.在調用函數時,實參將賦值給形參。因而,必須注意實參的個數,類型應與形參一一對應,並且實參必須要有確定的值。
形式參數:形參是函數被調用時用於接收實參值的變數。

根據實際需要可有可無。沒有形參時,圓括弧也不可省;多個參數之間應用逗號分隔。參數包括參數名和參數類型。

❺ 數組作為實參和形參的形式是怎樣的

兩者都可以,可以用下面的程序展示。

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

void sortArray(int *a, int num)

//void sortArray(int a[], int num)

{

for (int i = 0; i < num; i++)

{

for (int j = i + 1; j < num; j++)

{

if (a[i] < a[j])

{

int tem = a[i];

a[i] = a[j];

a[j] = tem;

}

}

}

}

void printfArray(int *a, int num)

//void printfArray(int a[], int num)

{

for (int i = 0; i < num; i++)

{

printf("%d ", a[i]);

}

printf(" ");

}

/*

1、數組作為參數時,本質是指針,這是C語言的特點

2、數組作為參數時,裡面的數字有誤均可,對程序不影響

*/

void main()

{

int a[] = { 1, 2, 4, 5, 2, 53, 536, 263, 726, 37, 3 };

int num = sizeof(a) / sizeof(a[0]);

printf("數組排序前列印: ");

printfArray(a, num);

//開始對數組進行排序

sortArray(a, num);

printf("數組排序後列印: ");

printfArray(a, num);

system("pause");

}

(5)編譯系統會根據形參的擴展閱讀:

用數組名作函數參數與用數組元素作實參有幾點不同。

1、用數組元素作實參時,只要數組類型和函數的形參變數的類型一致,那麼作為下標變數的數組元素的類型也和函數形參變數的類型是一致的。

2、在普通變數或下標變數作函數參數時,形參變數和實參變數是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送是把實參變數的值賦予形參變數。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。

因為實際上形參數組並不存在,編譯系統不為形參數組分配內存。那麼,數據的傳送是如何實現的呢?在我們曾介紹過,數組名就是數組的首地址。

因此在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之後,也就等於有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。

注意:

數組有兩個特殊的性質。一是不能復制數組;二是使用數組名字時,數組會自動轉化為指向其第一個元素的指針。由於數組不能復制,所以無法編寫使用數組類型形參的函數,因為數組會被自動轉化為指針。




❻ 關於形參與實參。

簡單的說是傳遞了數組首地址,詳細解釋如下:
在普通變數作函數參數時,形參變數和實參變數是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送是把實參變數的值賦予形參變數。
但在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組並不存在,編譯系統不為形參數組分配內存。因為數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之後,也就等於有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。
在普通變數作函數參數時,值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參,形參的值發生改變後,實參並不變化。
而當用數組名作函數參數時,情況則不同。由於實際上形參和實參為同一數組,因此當形參數組發生變化時,實參數組也隨之變化。當然這種情況不應理解為發生了「雙向」的值傳遞。

❼ 關於c語言數組的一些疑惑

數組元素不能做形參,這個論述是正確的。
我們都知道,單個元素可以做形參,數組也可以做形參。但是,二者有本質上的區別。
單個元素做形參,是建立一個變數副本,程序運行時,實參把值傳給副本,就沒有實參的什麼事了,後面對副本的賦值、改寫,都不會影響實參。
而數組做形參時,只是把實參的首地址傳給形參,後面對形參的元素的賦值和改寫,直接對實參的數組元素進行了賦值和改寫。
在C語言中,array[10]有兩種含義:
①它指含有10個元素的數組array,如:
int array[10];
②它指數組array的第10號元素,如:
array[10] =5;
因此,對於使用數組array[10](這里,你要把array[10]理解成含有10個元素的數組array,而不能理解成第10號元素)做形參,只寫array[]即可(只寫一個空的中括弧)。
但是,數組做形參時,C語言支持中括弧裡面寫入數字,如array[0]、array[1]或array[10]等,但它們都是一樣的,作用與寫成array[]完全相同。
就是說,數組做形參時,你可以無視中括弧內的數字(程序運行時,也不管中括弧內的數字)。
所以,定義函數語句:
float average( float array[10])
與寫成:
float average(float array[])
完全相同。
補充一點,數組形參的中括弧內寫上一個10,也有一個好處,它提醒編程人員這里需要一個含有10個元素的數組!但千萬不要理解成數組的第10號元素做形參。
OK?

❽ 1.函數重載時,編譯系統會根據____或_____來區分.

參數個數,參數類型。

❾ c語言形參的問題

這個肯定是沒有影響的因為在聲明部分,編譯器只獲取的是形參的類型,而不關心它的名字,聲明的作用只是為了便於給你定義的函數分配空間,所以只需要獲取形參的類型就行了而在定義部分,形參就轉變了它的意義(向實的方向轉換了),它必須要接收調用者傳遞來的參數(可以理解為簡單的賦值,其實也就是這么一回事),然後在自身函數中對形參進行處理,這樣,並不會影響實參的值,因為它們本身就不是同一個變數至於樓主最後的問題,上面已經解釋了,編譯器在編譯的時候並不會關心聲明部分形參的名字,所以,你寫於不寫都是沒有關系的,更何況一樣不一樣了

❿ C語言中很多的預處理指令include、define等等它們各自的意義分別是什麼

include的作用: #include叫做「文件包含」 / include 語句包含並運行指定文件。 功能:它的功能是用來指定文件的全部內容替換程序中的命令行,從而使指定的文件與當前源文件連成一個源文件 書寫格式: #include <文件名> //表示編譯系統根據系統頭文件存放的目錄路徑去搜索系統頭文件,而不是在源文件目錄去查找 #include "文件名" //表示編譯系統首先在當前的源文件目錄中查找,若未找到才根據系統的頭文件存放的目錄路徑去搜索系統頭文件 //系統定義的頭文件通常使用尖括弧;用戶自定義的頭文件通常使用雙引號。 //一般來說,如果為調用庫函數而用#include命令來包含相關的頭文件,則用尖括弧,以節約查找時間。 //如果要包含的是用戶自己編寫的文件(這種文件一般都在用戶當前的目錄中),一般用雙撇號。 //若文件不在當前目錄中,在雙撇號內應該給出文件路徑(如#include"C:\wang\file2.h") ----------------- 1.#define 的作用 在C或C++語言源程序中允許用一個標識符來表示一個字元串,稱為「宏」。被定義為「宏」的標識符稱為「宏名」。在編譯預處理時,對程序中所有出現的「宏名」,都用宏定義中的字元串去代換,這稱為「宏代換」或「宏展開」。宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。 在C或C++語言中,「宏」分為有參數和無參數兩種。 2. 無參宏定義 無參宏的宏名後不帶參數。 其定義的一般形式為: #define 標識符 字元串 其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為宏定義命令。「標識符」為所定義的宏名。「字元串」可以是常數、表達式、格式串等。 例如: #define M (a+b) 它的作用是指定標識符M來代替表達式(a+b)。在編寫源程序時,所有的(a+b)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(a+b)表達式去置換所有的宏名M,然後再進行編譯。 程序1: #define M (a+b) main(){ int s,y; printf("input a number: "); scanf("%d",&y); s=M*M; printf("s=%d\n",s); } 上常式序中首先進行宏定義,定義M來替代表達式(a+b),在 s= M * M 中作了宏調用。在預處理時經宏展開後該語句變為: S=(a+b)*(a+b) 但要注意的是,在宏定義中表達式(a+b)兩邊的括弧不能少。否則會發生錯誤。 如當作以下定義後:#difine M (a)+(b) 在宏展開時將得到下述語句:S= (a)+(b)*(a)+(b) 對於宏定義還要說明以下幾點: 1. 宏定義是用宏名來表示一個字元串,在宏展開時又以該字元串取代宏名,這只是一種簡單的代換,字元串中可以含任何字元,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程序時發現。 2. 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。 3. 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。 3. 帶參宏定義 c語言允許宏帶有參數。在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。 帶參宏定義的一般形式為: #define 宏名(形參表) 字元串 在字元串中含有各個形參。 帶參宏調用的一般形式為: 宏名(形參表) 例如: #define M(y) ((y)*(y)+3*(y)) /*宏定義*/ .... k=M(5); /*宏調用*/ .... 在宏調用時,用實參5去代替形參y,經預處理宏展開後的語句為: k=5*5+3*5 程序2: #define MAX(a,b) (a>b)?a:b main(){ int x,y,max; printf("input two numbers: "); scanf("%d%d",&x,&y); max=MAX(x,y); printf("max=%d\n",max); } 上常式序的第一行進行帶參宏定義,用宏名MAX表示條件表達式(a>b)?a:b,形參a,b均出現在條件表達式中。程序第七行max=MAX(x,y)為宏調用,實參x,y,將代換形參a,b。宏展開後該語句為: max=(x>y)?x:y; 用於計算x,y中的大數。

閱讀全文

與編譯系統會根據形參的相關的資料

熱點內容
單片機數控繞線機 瀏覽:606
pdf表格能轉excel 瀏覽:412
伺服器之間的負載均衡如何實現 瀏覽:204
多媒體伺服器執行什麼定額子目 瀏覽:216
php獲取手機標識 瀏覽:906
點擊錄制按鈕是什麼app 瀏覽:890
證據提取命令視頻 瀏覽:353
java的學習心得 瀏覽:96
prof命令 瀏覽:279
手機加密文件密碼怎麼解開 瀏覽:283
賈躍亭程序員完整視頻 瀏覽:959
怎樣把兩個文件夾打包發送 瀏覽:378
單片機教程資料 瀏覽:982
仿大眾點評系統源碼python 瀏覽:426
手機網路伺服器連接不上是怎麼回事 瀏覽:155
電腦為什麼一直要解壓 瀏覽:530
淘客優惠券網站源碼 瀏覽:555
word轉成pdf在線 瀏覽:775
手機暴力解壓教程 瀏覽:130
解壓小視頻第二期 瀏覽:364