定義函數的一般形式:
return_type function_name(parameter list)
{
body of the function
}
return_type:返回類型,有些函數執行所需的操作而不返回值,在這種情況下,return_type是關鍵字void
function_name:函數名稱,函數名和參數列表一起構成了函數簽名
parameter list:參數列表,參數就像佔位符。當函數被調用時,向參數傳遞一個值。參數列表包括函數參數的類型、順序、數量
body of the function:函數主體包含一組定義函數執行任務的語句
求倆個數大小實列:
#include<stdio.h>
int max(int num1,int num2)
{
/*局部變量聲明*/
int result;
if (num1>num2)
result=num1;
else
result=num2;
return result;
}
函數聲明
函數聲明會告訴編譯器函數名稱及如何調用函數。函數的實際主體可以單獨定義
在一個源文件中定義函數且在另一個文件中調用函數時,函數聲明是必需的。在這種情況下,應該在調用函數的文件頂部聲明函數
調用函數
當程序調用函數時,程序控制權會轉移給被調用的函數。被調用的函數執行已定義的任務,當函數的返回語句被執行時,或到達函數的結束括號時,會把程序控制權交還給主程序
例如:
#include<stdio.h>
int mian()
{
/*局部變量聲明*/
int a=100;
int b=200;
int ret;
/*調用函數來獲取最大值*/
ret = max(a,b);
printf("Max value is : %d\n",ret);
return 0;
}
/*函數返回兩個數中較大的那個數*/
int max(int num1,int num2)
{
int result;
if(num1>num2)
result = num1;
else
result = num2;
return result;
}
函數參數
如果函數要使用參數,則必須聲明接受參數值的變量。這些變量稱爲函數的形式參數
形式參數就像函數內部的其他局部變量,在進入函數時被創建,退出函數時被銷燬
兩種向函數傳遞參數的方法
- 傳值調用
把參數的實際值複製給函數的形式參數。在這種情況下,修改函數內的形式參數不會影響實際參數
實例:
void swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
return;
}
通過傳遞實際參數來調用函數swap():
#include<stdio.h>
void swap(int x,int y);
int main()
{
int a =100;
int b =200;
printf("交換前a的值:%d",a);
printf("交換前b的值:%d",b);
swap(a,b);
printf("交換後a的值:%d",a);
printf("交換後b的值:%d",b);
return 0;
}
上面的代碼被編譯執行後,結果如下:
交換前a的值:100
交換前b的值:200
交換後a的值:100
交換後b的值:200
雖然在函數內部改變了a和b的值,但實際上a和b的值沒有發生變化
-
引用調用
形參爲指向實參地址的指針,當對形參的指向操作時,就相當於對實參本身進行的操作傳遞指針可以讓多個函數訪問指針所引用的對象,而不是把對象聲明爲全局可訪問
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
return ;
}
通過引用傳值來調用swap():
#include<stdio.h>
void swap(int *x,int *y)
int main()
{
int a = 100;
int b = 200;
printf("交換前a的值:%d",a);
printf("交換前b的值:%d",b);
swap(&a,&b);
printf("交換後a的值:%d",a);
printf("交換後b的值:%d",b);
return 0;
}
編譯執行後,結果爲:
交換前a的值:100
交換前b的值:200
交換後a的值:200
交換後b的值:100
作用域是程序中定義的變量所存在的區域,超過該區域變量就不能被訪問。c語言中有三個地方可以聲明變量:
1.在函數或內部的局部變量
2.在所有函數外部的全局變量
3.在形式參數的函數參數定義中
局部變量
在某個函數或塊的內部聲明的變量,它們只能被該函數或該代碼塊內部的語句使用
局部變量保存在棧中,只有在 所在函數被調用時才動態地爲變量分配存儲單元。局部變量被定義時,系統不會對其初始化
全局變量
全局變量定義在函數的外部,通常是在程序的頂部。全局變量在整個程序生命週期內都要效,在任何的函數內部都能訪問全局變量
全局變量保存在內存的全局存儲區中,佔用靜態的存儲單元
形式參數
函數的參數,形式參數,被當作該函數內的局部變量,如果與全局變量同名它們會優先使用
數組數據結構,它可以存儲一個固定大小的相同類型元素的順序集合。
聲明數組
要聲明一個數組,需要指定元素的類型和元素的數量
type arrayName [ arraySize]
這叫一維數組。arraySize必須是一個大於0的整數常量,type可以是任意有效的c數據類型。
初始化數組
double balance[5]={1000.0,2.0,3.4,7.0,5.6}
大括號之間的值得數目不能大於方括號中指定得元素數目
所有的數組都是以0作爲它們第一個元素的索引,也被稱爲基索引
訪問數組元素
數組元素可以通過數組名稱加索引進行訪問
double salary = balance[9]
聲明數組、數組賦值、訪問數組實例:
#include<stdio.h>
int main()
{
int n[10];
int i,j;
for (i = 0 ; i < 10 ; i ++)
{
n [ i ] = i + 100;
}
for (j = 0 ; j < 10 ; j++)
{
printf("Element[%d] = %d\n",j,n[j])
}
return 0;
}
多維數組
聲明形式:
type name[size1][size2]...[sizeN];
二維數組,在本質上是一個一維數組的列表。聲明一個x行y列的二維數組
type arrayName[x][y];
初始化二維數組:
int a[3][4] = {
{0,1,2,3}, /* 初始化索引號爲0的行 */
{4,5,6,7}, /* 初始化索引號爲1的行 */
{8,9,10,11} /* 初始化索引號爲2的行 */
};
內部嵌套的括號是可選的,可以去掉
傳遞數組給函數
下面這個函數,它把數組作爲參數,同時還傳遞了另一個參數,根據所傳的參數,會返回數組中各元素的平均值
#include<stdio.h>
double getAverage(int arr[],int size);
int mian()
{
int balance = {1000.0,2,3,17,50};
double avg;
avg = getAverage(balance,5);
printf("平均值是:%f",avg);
return 0;
}
double getAverage(int arr[],int size)
{
int i;
double avg;
double sum = 0;
for (i=0 ; i<size ; ++i)
{
sum += arr[i];
}
avg = sum/size;
return avg;
}
從函數返回數組
c語言不允許返回一個完整的數組作爲函數的參數,但是可以通過指定不帶索引的數組名來返回一個指向數組的指針
如果想要從函數返回一個一維數組,必須聲明一個返回指針的函數
int * myFunction()
{
...
}
C語言不支持在函數外部返回局部變量的地址,除非定義局部變量爲static變量
下面的函數,它會生成10個隨機數,並使用數組來返回它們
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/* 要生成和返回隨機數的函數 */
int * getRandom()
{
static int r[10];
int i;
/* 設置種子 */
srand( (unsigned)time(NULL) );
for ( i=0 ; i<10 ; ++i)
{
r[i] = rand();
printf("r[%d] = %d\n",i,r[i]);
}
return r;
}
/* 調用上面定義函數的主函數 */
int main()
{
/* 一個指向數組的指針 */
int *P;
int i;
p = getRandom();
for ( i=0 ; i<10 ; i++)
{
printf("*(p + %d) : %d\n",i,*(p+i));
}
return 0;
}
指向數組的指針
數組名是一個指向數組中第一個元素的常量指針。因此,*(balance+4)是一種訪問balance[4]數據的合法方式
一旦把第一個元素的地址存儲在p中,就可以使用p、p+1、*(p+2)等來訪問數組元素
#include<stdio.h>
int mian()
{
double balance[5] = {1000.0,2.0,3.4,17.0,5.6};
double *p;
int i;
p = blance;
printf("使用指針的數組值\n");
for ( i = 0; i < 5; i++ )
{
printf("*(p + %d) : %f\n",i,*(p+i));
}
printf("使用balance作爲地址的數組值\n");
for ( i = 0; i < 5; i++ )
{
printf("*(balance + %d) : %f\n",i,*(balance+i));
}
return 0;
}
上面的實例中,p是一個指向double型的指針,這意味着它可以存儲一個double類型的變量。一旦有了p中的地址,*p將給出存儲在p中相應地址的值