int sum(int * ar, int n)
這裡,第1個形參告訴函式該陣列的位址和資料型別,第2個形參告訴函式該陣列中元素的個數。
關於函式的形參,還有一點要注意。只有在函式原型或函式定義頭中,才可以用int ar代替int * ar:
int sum (int ar, int n);
int *ar形式和int ar形式都表示ar是乙個指向int的指標。但是,int ar只能用於宣告形式引數。
第2種形式(int ar)提醒讀者指標ar指向的不僅僅乙個int型別值,還是乙個int型別陣列的元素。
注意 宣告陣列形參
因為陣列名是該陣列首元素的位址,作為實際引數的陣列名要求形式引數是乙個與之匹配的指標。只有在這種情況下,c才會把int ar和int * ar解釋成一樣。也就是說,ar是指向int的指標。由於函式原型可以省略引數名,所以下面4種原型都是等價的:
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar, int n);
int sum(int , int);
c 通常都按值傳遞資料,因為這樣做可以保證資料的完整性。如果函式使用的是原始資料的副本,就不會意外修改原始資料。但是,處理陣列的函式通常都需要使用原始資料,因此這樣的函式可以修改原陣列。有時,這正我們需要的。例如,下面的函式給陣列的每個元素都加上乙個相同的值:
void add_to(double ar, int n, double val)
然而,其他函式並不需要修改資料。例如,下面的函式計算陣列中所有元素之和,它不用改變陣列的資料。但是,由於ar實際上是乙個指標,所以程式設計錯誤可能會破壞原始資料。例如,下面示例中的ar[i]++會導致陣列中每個元素的值都加1:
int sum(int ar, int n) // 錯誤的**
ansi c提供了一種預防手段。如果函式的意圖不是修改陣列中的資料內容,那麼在函式原型和函式定義中宣告形式引數時應使用關鍵字const。例如,sum()函式的原型和定義如下:
int sum(const
int ar, int n); /* 函式原型 */
int sum(const
int ar, int n) /* 函式定義 */
以上**中的const告訴編譯器,該函式不能修改ar指向的陣列中的內容。如果在函式中不小心使用類似ar[i]++的表示式,編譯器會捕獲這個錯誤,並生成一條錯誤資訊。
這樣使用const並不是要求原陣列是常量,而是該函式在處理陣列時將其視為常量,不可更改。這樣使用const可以保護陣列的資料不被修改,就像按值傳遞可以保護基本資料型別的原始值不被改變一樣。一般而言,如果編寫的函式需要修改陣列,在宣告陣列形參時則不使用const;如果編寫的函式不用修改陣列,那麼在宣告陣列形參時最好使用const。
c語言 陣列問題二
輸入格式 輸入在一行中給出出生年份y和目標年份中不同數字的個數n,其中y在 1,3000 之間,n可以是2 或3 或4。注意不足4位的年份要在前面補零,例如公元1年被認為是0001年,有2個不同的數字0和1。輸出格式 根據輸入,輸出x和能達到要求的年份。數字間以1個空格分隔,行首尾不得有多餘空格。年...
C語言二維陣列
int main int argc,const char argv int array 5 建立乙個二維陣列 型別修飾符陣列名 包含幾個小陣列 每個小陣列有多少個元素 初始值如何寫?int array 3 4 一維陣列可以省略元素個數,二維陣列只能省略第一位 第乙個 3 可以不寫 第二種初始值寫法 ...
C語言 二維陣列
c語言之二維陣列 1 定義的基本格式 int a 1 2 1代表一行,2代表二列 難點 二維陣列的行列下標。字串結束標誌的實用。2 一維陣列和二維陣列的聯絡。一維陣列如同千層面一樣一層一層的,而二維陣列,只是給千層面切了幾刀 3 int a 2 3 a 0 0 是1,a 0 1 是2,a 0 2 是...