c语言笔记(递归函数、二级指针、指针函数)

前言

        记录嵌入式学习过程,持续更新。。。

递归函数

        一个函数直接或间接的调用自己就称为递归函数。

注意事项

递归函数缺点:
(1)占用栈区空间大,容易造成死循环;
(2)直到栈区空间不足,程序崩溃发生段错误结束。

注意事项:
        一定要有递归结束条件(出口)。

案例

        用递归函数,求1+2+3+...+100的和。

#include <stdio.h>
int getSum(int num)
{
	if(num == 1)
	{
		return 1;
	}
	int res = getSum(num-1)+num;
	return res;
}

int main()
{
	int res = getSum(100);
	printf("res is %d\n",res);

	return 0;
}

 练习

        1.计算一个正整数的幂,即实现函数fun(base,exponent),该函数返回base的exponent次幂。

#include <stdio.h>
long fun(int base,int e)
{
	if(e == 0)	//递归 程序结束出口 任何数的0次幂都是1
		return 1;
	return fun(base,e-1)*base;
}
int main()
{
	long ret = fun(2,10);
	printf("ret is %ld\n",ret);
	return 0;
}

        2.使用递归函数实现斐波那契数列,打印输出前20项,先正序,后逆序。(斐波那契数列前两项的值是1,从第三项开始任意一项的值都是前两项之和。)

#include <stdio.h>
int feibo(int n)
{
	if(n == 1 || n == 2)    //前两项的值为1 (递归结束条件)
		return 1;
	return feibo(n-1)+feibo(n-2);    //从第三项开始 前两项之和
}

int main()
{
	printf("-----正序------\n");
	int i;
	for(i = 1;i <= 20;i++)
	{
		printf("%d ",feibo(i));
	}
	printf("\n");
	printf("-----逆序------\n");
	for(i = 20;i >= 1;i--)
	{
		printf("%d ",feibo(i));
	}
	printf("\n");
	return 0;
}

二级指针

        指向指针的指针,指针存地址,二级指针存的是一级指针的地址。
        对一级指针取地址就变成二级

定义

int a = 10;
int *p = &a;    //占4字节
int **q = &p;    //对一级指针取地址变成二级指针 占4字节

用途1

        通过二级指针,能够在函数内部修改一级指针存放的内容。(在动态内存分配和链表中常见)

用途2

        用于传递指针数组时,见下面例子

#include <stdio.h>
#include <string.h>
//遍历数组
void showName(char **p,int n)
{
	int i;
	for(i = 0;i < n;i++)
	{
		printf("%s  ",p[i]);
	}
	printf("\n");
}
//对数组进行冒泡排序
void sortName(char **p,int n)
{
	int i,j;
	for(i = 0;i < n-1;i++)
	{
		for(j = 0;j < n-1-i;j++)
		{
			if(strcmp(p[j],p[j+1]) > 0)
			{
				char *temp = p[j];
				p[j] = p[j+1];
				p[j+1] = temp;
			}
		}
	}
}

int main()
{
	char* name[5] = {"aa","dd","cc","ee","bb"};
	
	showName(name,5);
	sortName(name,5);
	showName(name,5);
	return 0;	
}

malloc函数

        动态内存分配,在堆区分配连续的内存空间

int *p = (int *)malloc(10*sizeof(int));    //在堆区开辟
if(p == NULL)
{
    printf("malloc failed\n");
    return -1;
}

malloc函数的原型        void *malloc(size_t size);

(1)返回值类型为void*        可以通过强制转换为其他类型指针

(2)空间申请成功返回首地址,失败返回NULL

(3)头文件 #include <stdlib.h>

    malloc函数使用的注意事项:内存泄露
               
(1)malloc和free一定要成对使用;
                (2)堆区申请的内存必须手动释放;
                (3)必须加条件判断

指针函数

        返回值类型是指针的函数,就称为指针函数。
        返回值的类型:int*        void*        char* 等等        
        作用:调用这类函数能返回一个地址

举例

void* malloc(int size);
char *strcpy(char *dest, const char *src);

踩坑

踩坑一:strcmp函数的返回值问题

问题

解决

strcmp函数的返回值

  • 小于 0:表示第一个字符串小于第二个字符串。
  • 等于 0:表示两个字符串相等。
  • 大于 0:表示第一个字符串大于第二个字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值