评论

收藏

[C++] C语言编程学习笔记(鹏版)2021/7/25

编程语言 编程语言 发布于:2021-08-03 10:32 | 阅读数:334 | 评论:0

函数
库函数
MSDN(Microsoft Developer Network)
http://en.cppreference.com
www.cplusplus.com C语言库函数的字典(前面www改为zh就是中文版)
例:strcpy字符串拷贝
char*strcpy(char*destination,const char*source);
类型为字符,(目的地,出发地)
注意\0也拷贝
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[]="bit";
char arr2[]="#############";
strcpy(arr2,arr1);                     //拷贝字符串,将1拷贝到2
printf("%s\n",arr2);
return 0;
}
结果为bit
memset设置内存块
void*memset(void*ptr,int value,size_t num);
(起始地址,要填充的值,长度)
要保证替换的要小于等于被替换的长度
int main()
{
char arr[]="hello qwq";
memset(arr,’*’,5);
printf("%s\n"arr);
return 0;
}
结果为***** qwq
自定义函数
基本模板
ret_type fun_name(para1,*)         //ret_type指返回类型;fun_name指函数名;para1指函数参数
{                                                  //花括号内为函数体,交代的是函数的实现
statement;                       
}
输出两个数中较大值
int get max(int x;int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int a=10;
int b=20;
int max=get max(x,y);
printf("max=%d\n",max)
return 0;
}
写一个函数可以交换两个整型变量的内容
void Swap(int x;int y)           //void指空,在这里指没有返回值
{
int tmp=0;
tmp=x;
x=y;
y=tmp;
}
int main()
{
int a=10;
int b=20;
printf("a=%d,b=%d\n",a,b);
Swap(a,b);                               //Swap指交换
printf("a=%d,b=%d\n",a,b);
return 0;
}
监视时需要进入函数内部可以按F11进去
上述代码形参变了,但实参(地址)没有改变,即只传了数值没有改变地址,所以最后结果并没有交换
所以引出了下列技能
int main()
{
int a=10;
int* pa=&a;              //pa是指针变量,它的类型是int*
*pa=20;                 //解引用操作
printf("%d\n",a);          //结果显示为20
return 0;
}
从而可以运用到原来的程序改为
void Swap(int* pa;int* pb)           //void指空,在这里指没有返回值
{
int tmp=0;
tmp=*pa;
*pa=*pb;
*pb=tmp;
}
int main()
{
int a=10;
int b=20;
printf("a=%d,b=%d\n",a,b);
Swap(&a,&b);                    //注意此处传输的是地址
printf("a=%d,b=%d\n",a,b);         //结果正确交换
return 0;
}
函数的参数

  • 实际参数(实参)
真实传给函数的参数;实参可以是:变量、常量、表达式、函数等;注意在函数调用时必须有确定的值,以便把这些值传送给形参;

  • 形式参数(形参)
指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数;形式参数当函数调用完成之后就自动销毁了,因此形参只在该函数中才有效;
总结:形参相当于实参的一份临时拷贝,所以对形参的修改是不会改变实参的(所以第一次的程序无法正确交换ab)
函数的调用

  • 传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参

  • 传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式;这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
写一个函数打印100-200之间的素数
#include<stdio.h>
#include<math.h>
int is_prime(int n)
{
int j=0;
for(j=2;j<=sqrt(n);j++)                 //sqrt指开平方
{
if(n%j==0)
{
return 0;
}
}
return 1;
}
int main()
{
int i=0;
for(i=101;i<=200;i+=2)
{
if(is_prime(i)==1)
printf("%d\n",i);
}
return 0;
}
先写怎么用,再怎么实现这个函数
写一个函数,实现一个整型有序数组的二分查找
int binary_search(int arr[],int k)       //注意这里错误,因为此处传递的是数组arr首元素的地址(指针),而不是整个数组
{
int left=0;
int sz=sizeof(arr)/sizeof(arr[0]);      //所以这里求的是指针大小=4字节
int right=sz-1;
while(left<=right)
{
int mid=(right+left)/2;
if(arr[mid]<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,8,9,10};
int k=7;
int ret=binary_search(arr,k);
if(ret==-1)
{
printf("找不到指定的数字\n");;
}
else
{
printf("找到了,下标是:%d\n",ret);
}
return 0;
}
所以正确代码为
int binary_search(int arr[],int k,int sz)       
{
int left=0;
int right=sz-1;
while(left<=right)
{
int mid=(right+left)/2;
if(arr[mid]<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,8,9,10};
int k=7;
int sz=sizeof(arr)/sizeof(arr[0]);  
int ret=binary_search(arr,k,sz);                //将求sz放在函数外面
if(ret==-1)
{
printf("找不到指定的数字\n");;
}
else
{
printf("找到了,下标是:%d\n",ret);
}
return 0;
}
写一个函数,每调用一次这个函数,就会使num的值增加1
void Add(int* p)
{
(*p)++;                   //此处*p相当于num,此处加()是为了保证*p优先
}
int main()
{
int num=0;
Add(&num);
printf("num=%d\n",num);
Add(&num);
printf("num=%d\n",num);
Add(&num);
printf("num=%d\n",num);
return 0;
}

函数的嵌套调用和链式访问
函数和函数之间可以有机的组合的
嵌套调用
函数里面再套个函数(例如 函数2里再调用函数1)
链式访问
把一个函数的返回值作为另外一个函数的参数(例如函数1的输出作为函数2的输入)
int main()
{
printf("%d\n",printf("%d\n",printf("%d\n",43)))    //注意printf的返回值是打印的字符的个数
return 0;
}
结果为
43
2
1
函数的声明和定义
其一般使用方法为:先新建一个头文件.h和源文件.c;将函数的声明放在头文件.h里,定义放在源文件.c里
例子:
[add.h]
int Add(int x,int y);
[add.c]
int Add(int x,int y);
{
int z=x+y;
return z;
}
[test.c]
#include"add.h"     //自己定义的头文件用双引号
int main()
{
int a=10,b=20,sum=0;
sum=Add(a,b);
printf("%d\n",sum);
return 0;
}
用于分模块写程序
函数声明:

  • 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么;但具体是不是存在,无关紧要
  • 合适的声明一般出现在函数的使用之前,要满足先声明后使用
  • 函数的声明一般要放在头文件中的
函数定义:
函数的定义是指函数的具体实现,交代函数的功能实现


关注下面的标签,发现更多相似文章