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 ()();*

总结:今天需要强化的知识主要有externstatic,指针函数和函数指针,感觉尤其需要掌握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;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容