函數:
- 優點:
提高代碼的簡潔性;
提高代碼的重用性;
有利于程序的維護; - 函數的分類:
系統函數:
printf(),scanf(),gets(),puts()
數學函數math.h:
sqrt(num)
:對num
進行開根號處理
pow(num1,num2)
:num1^num2
;
toupper('q')
;小寫字母---->大寫字母;
tolower('Q')
;大寫字母---->小寫字母;
<stdlib.h>
:
rand()%num
;隨機產生一個0~num的整數(srand(time(0))
必須以這個作為種子,<time>
); - 有參函數和無參函數:
參數可以任意多個! - 函數的定義,函數的聲明以及函數的調用:
1)函數的定義:
DataType FunctionName(參數列表){
}
2)函數的聲明:
DataType FunctionName(參數列表);
主:
聲明時,參數列表一定要和定義時的參數列表一致?。。?!
3)函數的調用:
FunctionName(value);
value:數值
注:
函數調用時,實參值的類型,一定要和函數定義是的類型一致;
函數名表示函數的入口地址;
形參在調用時分配空間;
調用時系統會默認將形參的值賦給實參。
- 函數的返回值:
void
:無返回值
又返回值類型
函數遇到return
則函數結束。
全局變量:
在函數體之外定義的變量;
作用域:在變量定義處開始,一直到函數結束。
局部變量:
在函數體之內的局部變量;
函數結束時,局部變量自動釋放內存。
若全局變量和局部變量同名,局部變量優先級要高。。
關鍵字:
auto
:可省略,動態局部變量,auto int i = 5
-
static
:聲明靜態變量;
靜態變量若定義時沒有初始化,系統默認為0;
靜態變量只初始化一次。
靜態變量修飾函數:則此函數只能用于本文件,其他文件無使用。。
static可以修飾三個:靜態局部變量,靜態全局變量,靜態函數 -
extern
:聲明外部變量extern int sum;
修飾函數:extern int test();
聲明變量或函數在外部已經定義;
//number_compare.c
#include<stdio.h>
int arr[20] = {0};
extern void randArr(int arr[]);
int main(int argc,char *argv[]){
randArr(arr);
return 0;
}
//compare.c
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
extern int arr[20];
void randArr(int arr[]){
int i = 0;
srand(time(NULL));
for(i = 0;i < 20;i++){
arr[i] = rand()%100;
printf("arr[%d] = %d\n",i,arr[i]);
}
return ;
}
需要將兩個函數放在不同的文件里邊,但是進行編譯的時候將兩個文件的進行同時編譯,但是變量和函數都需要extern進行聲明;
-
register
:寄存器變量:變量直接存放在寄存器中,CPU的寄存器個數有限,不可以定義多個寄存器變量。
速度快。
const
:常量,不可更改其值。
只讀變量。。
const int num = 5;
int const num = 5
;
const int *p
;
int const *p
; //值不可更改
int *const *p
; //址不可更改
const int* const p
; //值和址都不可更改。
** - 指針函數和函數指針
指針函數:
int *test()
;
返回一個局部地址是不允許的;返回的是一個地址。。
函數指針:
下列中說明了調用函數指針的兩種方式。
#include<stdio.h>
int test(){
int a = 5;
a += 6;
printf("a = %d\n",a);
return a;
}
int main(){
//指針的類型:int (*)();
int (*pa)() = test;
pa();//函數指針的兩種調用方式
(*pa)();
return 0;
}
** 指針的類型:int ()();*
總結:今天需要強化的知識主要有extern
,static
,指針函數和函數指針,感覺尤其需要掌握extern
,以前不知道extern
如何使用。
作業:
自定義函數實現:
1.練習使用自定函數,實現比較兩個數的大小,并且返回輸出最大數
#include<stdio.h>
int numMax(int a,int b);
int main(int argc,char *argv[]){
int num1 = 0;
int num2 = 0;
printf("input two numbers of compare:");
scanf("%d %d",&num1,&num2);
numMax(num1,num2);
return 0;
}
int numMax(int a,int b){
int max = a>b?a:b;
printf("max = %d\n",max);
return max;
}
2.練習傳值和傳址
#include<stdio.h>
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
return;
}
void swap_pointer(int *p1,int *p2){
int temp = *p1;
*p1 = *p2;
*p2 = temp;
return;
}
int main(int argc,char argv[]){
int num1 = 0;
int num2 = 0;
printf("input two number of exchange:");
scanf("%d %d",&num1,&num2);
swap(num1,num2);
printf("swap****(num1,num2) = (%d,%d)\n",num1,num2);
swap_pointer(&num1,&num2);
printf("swap_pointer*******(num1,num2) = (%d,%d)\n",num1,num2);
return 0;
}
3.編寫一個程序,用于產生20個0~10之間的隨機數,將這20個隨機數存入數組,并通過函數統計這些隨機數中某個數出現的次數。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define NUM 20
void randMath();
void arrCount(int arr[],int buf[]);
void printfBuf(int arr[],int index);
int main(int argc,char *argv[]){
srand(time(0));
int arr[20] = {0};
int buf[10] = {0};
randMath(arr);
arrCount(arr,buf);
printfBuf(buf,10);
return 0;
}
//產生隨機數組
void randMath(int arr[]){
int i = 0;
for(i = 0;i<NUM;i++){
arr[i] = rand()%10;
printf("arr[%d] = %d\n",i,arr[i]);
}
// printf("arr[%d] = %d",)
}
//將統計的數組放入另一個數組中
void arrCount(int arr[],int buf[]){
int i = 0;
int j = 0;
for(i = 0;i < 10;i++){
for(j = 0;j < 20;j++){
if(arr[j] == i)
buf[i]++;
}
}
return;
}
//輸出這個存放個數的數組
void printfBuf(int arr[],int index){
int i = 0;
for(i = 0;i < index;i++){
printf("數組中為'%d'的數有%d個\n",i,arr[i]);
}
return;
}```
4.由小到大輸出三個輸入3個數,按由小到大的順序輸出,要求兩個數的值交換的功能用函數實現。
include<stdio.h>
void swapPointer(int *p1,int *p2);
int main(int argc,char *argv[]){
int num1 = 0;
int num2 = 0;
int num3 = 0;
printf("input three number:");
scanf("%d %d %d",&num1,&num2,&num3);
swapPointer(&num1,&num3);
printf("num1 = %d,num2 = %d,num3 = %d\n",num1,num2,num3);
return 0;
}
void swapPointer(int *p1,int *p2){
int temp = *p1;
*p1 = *p2;
*p2 = temp;
return;
}