C语言基础函数
函数:
- 优点:
提高代码的简洁性;
提高代码的重用性;
有利于程序的维护; - 函数的分类:
系统函数:
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;
}