初识C语言函数鹏哥

  • 本文对应鹏哥c语言初识C语言的函数后部分
  • 函数的参数
  1. 实际参数:常量变量表达式函数,真实传给函数的值
  2. 形参:函数名括号中的变量,形参在函数调用完就自动销毁,局部变量。
  3.    形参实例化之后相当于实参的一份临时拷贝,形参拥有自己的空间
  • 传值调用

形参和实参占用不同的内存块,对形参的修改不会改变实参

  • 传址调用

把函数外部创建变量的内存地址传给函数参数

void add(*p)
{

*p++;
}
int main()
{
 add(&num);
}
  • 练习
    函数判断是不是素数
    #include <stdio.h> 
    int prime(int x)
    {
    	int flag = 0;
    	int a = 0;
    		for (a = 2; a <  x; a++)
    		{
    			if (x % a == 0)
    			{
    				flag = 1;
    				break;
    			}
    		}
    		return flag;
    }
    int main()
    {
    	int i = 0;
    	int a = 0;
    	for (i = 100; i <= 200; i++)
    	{
    		if (prime(i) == 0)
    			printf("%d\n", i);
    	}
    	return 0;
    }
    闰年
    //能被400整除
    //能被4但是不能被100整除
    #include <stdio.h> 
    int year(int x)
    {
    	int flag = 0;
    	if(((x % 4 == 0 )&& (x % 100!=0))||(x % 400 == 0))
    	{
    		flag = 1;
    	}
    		return flag;
    }
    int main()
    {
    	int i = 0;
    	for (i = 1000; i <= 2000; i++)
    	{
    		if (year(i) == 1)
    			printf("%d ", i);
    	}
    	return 0;
    }
    整形有序数组二分查找
    
    #include <stdio.h> 
    int search(int arr[],int k,int sz)
    {
    	int left = 0;
    	int right = sz - 1;
    	int mid = left +( right-left) / 2;
    	while (left<=right)
    	{
    		if (arr[left] < k)
    		{
    			left = mid + 1;
    		}
    		else if(arr[mid]>k)
    		{
    			right = mid - 1;
    		}
    		else 
    		{
    			return mid;
    		}
    	}
    	return -1;
    	
    }
    int main()
    {
    	int arr[] = {1, 2, 3, 4, 5, 6, 7};
    	int k;
    	k = 7;
    	int sz = 0;
    	sz = sizeof(arr) / sizeof(arr[0]);
    	int a = 0;
    	a=search(arr, k,sz);
    	if (a == -1) 
    	{
    		printf("找不到");
    	}
    	else
    	{
    		printf("下标是%d", a);
    	}
    	return 0;
    }

    形参不能用sizeof计算数组大小,数组传参实际上传递了数组首元素的地址,arr实际上是指针变量

  • c99引入bool类型 #include <stdbool.h>真假 

bool is_prime (int n) 真假false true

  • 函数嵌套

可以嵌套调用,但是不能嵌套定义

  • 函数声明
#include “add.h"
  • 函数递归

存在限制条件,满足这个限制条件递归不再继续,递归调用之后越来越接近限制条件

接受一个整型值,按顺序打印每一位
#include <stdio.h> 

//%u是打印无符号的整数
void print(unsigned int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	unsigned int num = 0;
	scanf("%u", &num);
	print(num);
	return 0;
}

栈溢出

栈区 局部变量 返回值 函数的形参 每一次函数调用都会都会在栈区申请空间

堆区 动态内存分配 malloe free calloc realloc

静态区  静态变量 全局变量

  • 作业
//N的阶乘
#include <stdio.h> 

//%u是打印无符号的整数
int fac( int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n - 1);
	
}
int main()
{
	 int num = 0;
	 int res = 0;
	scanf("%d", &num);
	res=fac(num);
	printf("%d",res);
	return 0;
}

if (i=5)是赋值,不是判断     

char 属于整形家族,ascii码

switch后面必须是整形,int,long char

case如果没有Break继续执行

void swap(int*px,int*py)
{
int tmp=*px;
*px=*py;
*py=tmp;
}
swap(&a,&b);

                                                                                                                                                                                                


//求最大公约数
int main()
{
	 int a= 0;
	 int b= 0;
	scanf("%d %d", &a,&b);
	//辗转相除法
	while (a % b)
	{
		int c = a % b;
		a = b;
		b = c;
	}
	printf("%d",b);
	return 0;
}

最小公倍数a*b/最大公约数

for循环 continue回到调整语句a++

int main()
{
	 int a= 0;
	 int b= 0;
	scanf("%d %d", &a,&b);
	//辗转相除法
	while (a % b)
	{
		int c = a % b;
		a = b;
		b = c;
	}
	printf("%d",b);
	return 0;
}

%-2d左对齐

函数设计应该追求高内聚低耦合

设计函数的时候尽量做到谁申请的资源就由谁释放

在不同函数里可以使用相同名字的变量

函数调用传递两个参数,指针,数组,全局变量,不能用return返回两个值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值