c语言 函数精讲

函数基础

跳出循环

关键字作用
return直接返回函数,所有函数体内的代码都不会再执行了
continue跳出循环中的这一次(离他最近的循环),然后继续循环
break直接跳出循环(离他最近的那层循环),不执行了

continue示例
到这里后面的不执行下去了,执行下一个

#include <stdio.h>
int main(int argc, char *argv[])
{
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<6;j++)
		{
		
			if(j==2)
				continue;
			printf("内层循环的值为:%d\n",j);
		}
		printf("外层%d\n",i);
	}
	return 0;
} 

在这里插入图片描述
案例2:只打印了1和2,因为他碰到continue之后就重新走一遍最外面的这个while循环。所以后面的这些都没打印出来

#include <stdio.h>
int main(int argc, char *argv[])
{
	printf("1\r\n");
	while(1)
	{
		int i=0;
		printf("2\r\n");
		if(i==0)
		{
			continue;
		} 
		printf("3\r\n");	
		while(1)
		{
			printf("进入内循环中了\r\n");
		}
	}
	printf("进入外循环中了\r\n");

	
	return 0;
}

在这里插入图片描述

break示例1:
到这里直接退出当前整个循环

#include <stdio.h>
int main(int argc, char *argv[])
{
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<6;j++)
		{
		
			if(j==2)
				break;
			printf("内层循环的值为:%d\n",j);
		}
		printf("外层%d\n",i);
	}
	return 0;
} 

在这里插入图片描述
break示例2:

#include <stdio.h>
int main(int argc, char *argv[])
{
	for(int i=0;i<8;i++)
	{
		if(i==3)
		{
			break;
		}
		printf("i的值为:%d\r\n",i);
	} 
	printf("进入外层了\r\n"); 
	return 0;
}

在这里插入图片描述

函数返回值

  • 可以返回一个数值,字符串地址。因为字符串在C语言中是比较特殊的,他会自己找到一个固定的常量存储区来存放,他存储的位置可不在这个函数里面
  • 但是注意不要返回一个数组的地址,因为这个数组是会被销毁的。也就是不要返回一个局部变量的指针,局部变量的作用域仅限于函数中,出了函数就什么都没有了
#include <stdio.h>
char *string(void)
{
	char*a="苹果电脑";//直接写成return "苹果电脑" 结果都是一样的
	return a;
} 
char *array()
{
	char a[]="小米手机";
	return a; 
} 
int sss (void)
{
	int a=2;
	return a;
	
}


int main(int argc, char *argv[])
{

	printf("返回的字符串为:%s\n",string());  //可以返回一个字符串地址, 
	printf("返回的数组是:%s\n",array());	  //不能返回数组地址,因为数组会被销毁 
	printf("返回的数值为:%d\n",sss());		//直接返回一个数值 
	
	return 0;
}

在这里插入图片描述

BSS

BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。

语句

语句里面应该都是隔离的,也就是里面定义的变量 外面不能使用,比如下面这个if定义了b,外面不能使用b(应该是b的寿命随着if这段代码的结束而结束)

#include <stdio.h>
int main(int argc, char *argv[])
{
	int x=0;
	if(x<1)
	{
		int b=5;
		printf("括号里面:%d\n",b);
		x++;
	} 
	int b=10;//把这句屏蔽了 就会报错
	printf("括号外面:%d\n",b);
	return 0;
}

在这里插入图片描述

while

num–是先判断语句,然后再–。–num先减减再判断语句

#include <stdio.h>
int main(int argc, char *argv[])
{
	int num=1;
	while(num--)
	{
		printf("%d\n",num);
	} 
	return 0;
}

在这里插入图片描述

#include <stdio.h>
int main(int argc, char *argv[])
{
	int num=1;
	while(--num)
	{
		printf("%d\n",num);
	} 
	return 0;
}

在这里插入图片描述

switch

default也是需要碰到break(或者将它放到最后一句,才会退出),如果没有default,又没有合适的值就直接执行下一句了

#include <stdio.h>
int main(int argc, char *argv[])
{
	   /* 局部变量定义 */
   char grade = 'G';
 
   switch(grade)
   {
   case 'A' :
      printf("很棒!\n" );
      break;
   case 'B' :
   case 'C' :
      printf("做得好\n" );
      break;
      
    default :
      printf("无效的成绩\n" );
   case 'D' :
      printf("您通过了\n" );
      break;
      
   case 'F' :
      printf("最好再试一下\n" );
      break;
   }
   printf("您的成绩是 %c\n", grade );
 
	return 0;
}

在这里插入图片描述
最后一句没有break也会退出

#include <stdio.h>
int main(int argc, char *argv[])
{
	   /* 局部变量定义 */
   char grade = 'F';
 
   switch(grade)
   {
   case 'A' :
      printf("很棒!\n" );
      break;
   case 'B' :
   case 'C' :
      printf("做得好\n" );
      break;
      
   case 'D' :
      printf("您通过了\n" );
      break;
      
   case 'F' :
      printf("最好再试一下\n" );
   
   }
   printf("您的成绩是 %c\n", grade );
 
	return 0;
}

在这里插入图片描述

for

每次进入循环体前,都需要判断此时是否满足中间这项(第一次进入也是),满足则进入;过程,第一次赋值后判断然后进入,第二次自增判断然后进入

#include <stdio.h>
int main(int argc, char *argv[])
{
	for(int i=0;i<2;i++)
	{
		printf("%d\n",i);
	}
	return 0;
}

在这里插入图片描述

  • 循环内定义的变量,出了循环体就不能用了。
  • 里面如果定义了和外面重名的变量,那么在里面对这个变量做的改变,是不会影响到外面的变量的
  • 不管是i++还是++i都是一样的
#include <stdio.h>
int main(int argc, char *argv[])
{
	
	int a=5; 
	for(int i=0;i<1;i++)//这里i++和++i都是一样的 
	{
		int a=1;
		int b=2;
		a=100;	
		printf("循环里面a的值为:%d\r\n",a);
	}
//	printf("i的值为:%d\r\n",i); 添上这两句话中的任意一句,就会报错 
	printf("a的值为:%d\r\n",a);//在里面定义了同名的变量,那么里面的变量就会覆盖外面的,也就不会对外面的变量造成影响了 
//	printf("b的值为:%d\r\n",b); 加上这句话也就不对了 在循环里面定义的变量出了就不能用了 
	return 0;
}

在这里插入图片描述

? :

对于条件表达式b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式绝不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d : e将按a ? b : (c ? d : e)执行。

运算符

小甲鱼
CSDN

内存申请与释放

free释放的内存大小,是在malloc的时候就确定了的,malloc函数实际所分配的空间会比要求的大一些,额外的分配的空间会用来记录管理信息,比如分配块的长度等。

#include <stdio.h>
int main(int argc, char *argv[])
{
 	char *str;
 
   /* 最初的内存分配 */
   str = (char *) malloc(15);
   strcpy(str, "runoob");
   printf("String = %s,  Address = %p\n", str, str);
 
   /* 重新分配内存 */
   str = (char *) realloc(str, 25);
   strcat(str, ".com");
   printf("String = %s,  Address = %p\n", str, str);
 
   /* 释放已分配的内存 */
   free(str);
   printf("String = %s,  Address = %p\n", str, str);
   
	return 0;
}

在这里插入图片描述

特殊函数

C语言static函数声明中__init标识符的含意

一般的static函数,执行后会常驻于内存,以便其它程序再次调用。加上__init标识后,该函数只会被调用一次,调用之后,函数立即被回收,以节约内存开销。

atof 字符串浮点数字转换

stdlib.h
把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
原型

double atof(const char *str)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	double result;
//	char *str1="第一个数为20.3";  字符是跳不过的
 	char *str1="    20.3华为";      //空格是可以跳过的 到非数字结束 
	char *str2="-15";

	printf("atof(str1):%f\n",atof(str1));

	result = atof(str1)+atof(str2);
	printf("atof(str1)+atof(str2)的值为:%f\n",result) ;
	return 0;
}

在这里插入图片描述

atoi字符串数字转真实数字

参考

  • 只能是数字,字母是转不了的
  • 该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
#include <stdio.h>
#include <stdlib.h>   //atoi就包含在这个头文件中的 
#include <string.h>

int main()
{
   int val;
   char str[20];
   //str="2555";   字符串是不能这样赋值的
 
 /*  
   str[0]='c';   //可以这样赋值 
   printf("str[0]=%c\n",str[0]);
 */
 /*
 字符串可以这样写的 
    char *p=NULL;
    p="abd";
    p="ddddd";
    printf("p的值为:%s\n",p);
 */
 
   strcpy(str, "98993489");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

 
   strcpy(str, "runoob.com");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

   return(0);
}

在这里插入图片描述

scanf

参考
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a,b,c;
    char d,e,f;
	char str1[20], str2[30];	
/*	*/
    printf("请输入三个数字:");
    scanf("%d%d%d",&a,&b,&c);      //每个数字之间只能用空格(或者回车,回车就不在一行上了,还是空格好)隔开; 好了按个回车键 
    printf("%d,%d,%d\n",a,b,c);	
	
 	printf("请输入三个数字:");
    scanf("%d, %d, %d",&a,&b,&c);	//只能用逗号(要英文逗号)隔开  ;好了按个回车 
    printf("%d, %d, %d\n",a,b,c);

    printf("请输入三个字符:");
    scanf("%c%c%c",&d,&e,&f); 	//在用 %c 输入时,空格和"转义字符"均作为有效字符(也就是会吃了上面那句输入时按的回车);好了按个回车 ;
    printf("%c,%c,%c\n", d,e,f);	
	
   printf("请输入用户名:");		 //当中不能有空格,有空格了之后那句就会算进下一句里面   此时他也会吃了上面那句按下的回车 
   scanf("%s", str1);
   printf("请输入您的网站:");
   scanf("%s", str2);
   printf("输入的用户名:%s\n", str1); 
   printf("输入的网站:%s", str2);

	return 0;
}

在这里插入图片描述

gets

参考
在这里插入图片描述

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a,b,c;
    char d,e,f;
	char str1[20], str2[30];	
/*	
    printf("请输入三个数字:");
    scanf("%d%d%d",&a,&b,&c);      //每个数字之间只能用空格(或者回车,回车就不在一行上了,还是空格好)隔开; 好了按个回车键 
    printf("%d,%d,%d\n",a,b,c);	
	
 	printf("请输入三个数字:");
    scanf("%d, %d, %d",&a,&b,&c);	//只能用逗号(要英文逗号)隔开  ;好了按个回车 
    printf("%d, %d, %d\n",a,b,c);

    printf("请输入三个字符:");
    scanf("%c%c%c",&d,&e,&f); 	//在用 %c 输入时,空格和"转义字符"均作为有效字符(也就是会吃了上面那句输入时按的回车);好了按个回车 ;
    printf("%c,%c,%c\n", d,e,f);	
	
   printf("请输入用户名:");		 //当中不能有空格,有空格了之后那句就会算进下一句里面   此时他也会吃了上面那句按下的回车 
   scanf("%s", str1);
   printf("请输入您的网站:");
   scanf("%s", str2);
   printf("输入的用户名:%s\n", str1); 
   printf("输入的网站:%s", str2);
*/
   char str[50];

   printf("请输入一个字符串:");
   gets(str);//回车完成这句话 

   printf("您输入的字符串是:%s", str);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值