C语言基础-函数
函数(本身有代码,链接时程序执行先将函数参数入栈,再运行函数代码)
1.参数(形参/实参)
(1)形参
实参在主调函数中定义与使用(进入被调函数后,实参变量不能使用)
实参可以是常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
如调用输出函数时,格式化字符串嵌入的变量必须有值。
调用函数时:
①为函数的形参分配地址
②将实参的值 赋值给形参
③函数结束,释放形参地址
(2)实参
①定义/声明实参时,分配地址
②实参赋值
③调用函数,将实参值传给形参
2.传值与传址调用
传值调用和引用调用指的是用于参数传递过程中的一种机制。
传值调用:只使用实参的值。
传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。
引用调用:
将实参的地址传递给形参,从表面上看是以实参变量取代形参,因此任何发生在形参上的改变实际上都发生在实参变量上。
传址调用(C和C++):参数为数组时是传址
核心:把实参地址传进去,然后用*运算取地址的内容
1.实参
①定义/声明实参时,分配地址
②实参赋值
③调用函数,将实参地址传给形参
2.形参(指针变量)
函数调用时
①为函数的形参(指针变量)分配地址
②将实参的地址 赋值给形参(指针变量)
→指针变量(形参)指向实参的存储位置
→在被调函数中若改变形参的值,也就改变了原来变量的数值。
③函数结束,释放形参地址
void swap(int *p, int *t){}
//指针p赋值&a ⇒指针p指向a
int p,t;
swap(&p,&t)传地址
总结⇒传址/引用(换名),都是为了使形参指向实参实际的内存地址。
引用(别名)传参(C++)
变量引用&
(1)概念
引用一个现有的变量声明一个引用(别名)变量
引用(别名)变量与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储单元
(2)初始化
声明引用时必须指定它代表的是哪一个变量,即对它初始化。
int b;
int &a=b; //声明a是变量b的引用
实参
int n=10;
add(n);
void add10(int &a)
{
a=a+10;
}
int main(int argc, char** argv);
argc表示参数的个数,argv里边存储各个参数
;第二个参数中argv[0]为自身运行目录路径和程序名,argv[1]指向第一个参数、argv[2]指向第二个参数
#include <stdio.h>
int main(int argc, char *argv[ ])
{
printf("%s\n",argv[0]);
return 0;
}
主函数main并非程序的真正入口!
在编译器对你的工程文件进行编译时,它是先找到你的main函数,然后根据main函数类型,把一段前缀入口程序预先编译,再让它去调用main函数.当你的main函数需要参数时,它就编译有参数main函数调用,反之则编译无参数main函数调用.
所以编译器是自动识别你的main函数类型的!
void main无返回值,部分编译器可以通过。
默认库
输出:int fprintf ( FILE *fp, char * format, … );
函数声明:int printf(const char *format, ...)
函数调用:printf("<格式化字符串>", <参量表>);
format – 字符串(或字符数组指针),包含了要被写入到标准输出 stdout 的文本。
它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化 。
转换说明符:
%c 字符 %s 字符串
%d 、%i 有符号十进制整数 %4d 四个为单位,右对齐
%u 无符号十进制整数
%f 浮点数(包括float和doulbe,默认保留六位小数,%.6f)
%o 八进制整数 %x 十六进制整数
%p 指针
输入:int fscanf ( FILE *fp, char * format, … );
scanf("%d",&n);
把接收到的数据存入到整形变量n的内存中,
如果变量为数组或者指针,则不需要&
输入、输出:putchar()、puts()、gets()、getc()
putchar():输出字符数据,puts()输出字符串数据。
gets()、getc()
文件流:fgetc()、fpuc()
int fgetc(fp) :从fp所指的文件中获取下一个字符,出错返回EOF,否则返回所读的字符。
int fputc(int char, FILE *stream);
char *fgets(char *buf, int bufsize, fp);
*buf: 字符型指针,指向用来存储所得数据的地址。bufsize: 整型数据,指明存储数据的大小。
fpintg(fp,’’%?",变量名)
#include <stdio.h>
int main()
{
FILE *fp; //文件流。
if((fp=fopen("test.txt","r"))==NULL)
printf("%s","错误");
//char c;
//while((c=fgetc(fp))!=EOF)
// printf("%c",c);
char f[10];
fgets(f,10,fp);
puts(f);
fclose(fp);
return 0;
}
字符串相关
获取字符串长度 strlen():
size_t strlen(char const* str):size_t也就是无符号整数
计算指定字符串 str 的长度,但不包括结束字符(即 null 字符:’\0’)
其他:
LT小于 :LE小于等于 GT大于 GE大于等于 EQ等于 NE不等于
math.h
sqrt():计算非负实数的平方根
abs(int x);求整数x的绝对值
fabs(double x);求浮点数x的绝对值.
pow(a,n):a的n次方,a和n还有返回结果都是double类型
string.h
strcpy(新,旧):复制字符串的,接受两个参数,一个是被复制字符串,另一个新字符串
strcmp(str1,str2)
string compare(字符串比较),用于比较两个字符串并根据比较结果返回整数。
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止
当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。
stdlib.h
malloc/realloc/free 申请、释放内存:
malloc分配指定大小的内存
void * malloc(long NumBytes):分配NumBytes个字节,并返回指向该内存的指针。分配失败返回一个空指针。
realloc 是在原有的基础上在开辟若干空间
指针名=(Elemtype *)realloc(原指针名,新大小)
①先释放原来指针 所指内存区域
②按照新大小重新分配空间
③将原有数据从头到尾拷贝到新分配的内存区域
④并返回该内存区域的首地址。即重新分配存储器块。
void free(void *ptr):C语言中释放内存空间的函数.
通常与申请内存空间的函数malloc()结合使用,可以释放由 malloc()、calloc()、realloc() 等函数申请的内存空间。
(Elemtype *) ;可将malloc返回的类型(void * )
强制转换为(Elemtype *)类型
用法:指令名=(Elemtype )malloc( nsizeof(Elemtype))
指针名 ⇔ 指针 指向内存的首地址(如数组指针的基地址)