C语言基础知识总结
一.常见的几种API
1.输入字符串
puts();
printff("%s",p);
eg:void myputs(char *p) //*除了变量声明,定义以外,都是运算符
{
//字符串明显的特点:结尾有'\0'
while( *p != '\0'){
putchar(*p++);
//printf("%c\n",*p++);
}
putchar('\n');
}
2.获取字符串
gets(); 内存是否合法
scanf("%s",p);
eg:int mygets(char *p)
{
int cnt = 0;
if(p == NULL){
printf("内存非法\n");
return;
}
while( *p = getchar()){
if(*p == '\n'){
return cnt;
}else{
cnt++;
p++;
}
}
}
3.计算长度(strlen)
eg:int myStrlen(char *str)
{
int cnt = 0;
while( *str++ != '\0'){
cnt++;
}
return cnt;
}
4.初始化(memset)
eg:void myMemset(char *p, char c, int size)
{
while(size){
*p++ = c;
size--;
}
}
5.拷贝
strcpy
strncpy
原函数:char*strcpy(char*dest,const char*src)
eg:char *myStrcpy(char* dest, const char *src)
{
if(dest == NULL || src == NULL){
return NULL;
}
//字符串结尾是‘\0’
while( *src != '\0'){
*dest++ = *src++;
}
*dest = '\0';
return dest;
}
char *myStrncpy(char* dest, const char *src, int n)
{
if(dest == NULL || src == NULL){
return NULL;
}
//字符串结尾是‘\0’
while( *src != '\0' && n>0){
*dest++ = *src++;
n--;
}
*dest = '\0';
return dest;
}
6.拼接
strcat
eg:void myStrcat(char *dest, char *src)
{
while( *dest != '\0'){
dest++;
}
while( *src != '\0'){
*dest++ = *src++;
}
}
7.比较
strcmp
8.查找
strchr
9.字符串分割
strstr
strtok
10. 转为小写的函数
strlwr
strupr
二.!在C语言中的用法
1.用来做逻辑运算中的非运算
!用作非运算时,是单目运算符,与右侧的表达式结合。
eg:!exper的含义(exper == 0)即当exper值为0时,结果为1否则结果为0。
2.和=联用,组成逻辑判断的不等于运算
!=是一个操作符,表示逻辑运算的不等于,其为双目运算符,左右都要有表达式,形式为exper1! = exper2 ,当exper1和exper2值相等时,结果为0,否则结果为1。
3.出现于字符串中,或者以"!"形式出现时,即字符常量!,其ascii码值为0x21,10进制为33.
4.双目运算符
运算所需要变量为两个的运算符,要求对象的个数是2.
5.c语言!的含义
(1)!=就是不等于
(2)表非,加层否定
三.C语言中%c%d等代表什么含义
1.%a(%A) 浮点数,十六进制数字
2.%c 字符
3.%f 浮点数(包括float和double)
4.%e(%E) 浮点数指数输出[e-(E)计数法]
5.%g 浮点数不显示无意义的零“0”
6.%i 有符号十进制整数(与%d相同)
7.%p 指针
8.%s 字符串
四.数组及指针的总结
1.整型变量:存放的是整数
eg:int a; a = 10
2.字符变量:存放的字符
eg:char c; c = ‘A’
3.指针变量:存放的是指针
eg: int *p; p = &a
int p; p = &c
4.只有定义一个指针变量的时候,才是指针的标识符
5.其他情况,都是一个运算符,此时代表的是一个运算符,跟±x/运算类似,该运算符的功能是取出内存地址中数据的值(取内容)。
6.指针 = 地址
(1)存放指针的变量
(2)存放地址的变量
7.变量的访问有两种方式
(1)变量名
eg:花店:一路以花店名问路找到花店
(2)地址
eg:地址:店的地址;导航过去
8.指针的使用
(1)指针分类型
(2)指针++根据类型不同,偏移值不同
(3)指针数组
数组首地址<1>数组名 int array[10], int p, p = array
<2>第一个元素的地址 array[10], int *p, p = &array[0]
指针注意偏移的位置,不要超出了数组
9.数组指针
(1)一个指针变量
(2)真正地指向某个类型整型数组的指针
<1>以前我们指针是指向数组的头
<2>此指针明确规定了要指向数组的类型及大小
eg:int (*p)[4]
10.指针数组
(1)指针的数组
(2)好多指针放在一起
(3)是一个数组,数组的每一个元素是指针<好多变量的地址的集合>
eg:int *p[4]
11.数组元素个数的计算方法
arrayprintf(array,sizeof(array)/sizeof(array[0]))
12.如何通过函数指针调用函数
(1)直接通过占用空间四个字节
eg:p2();
(2)取内容<*指针名字>
eg:(*p2)();
13.(1)一个整型数占用空间4个字节
eg:int a[3];
(2)一个char型占用空间1个字节
eg:char b[3];
(3)函数调用中,传参就是一个赋值的过程,实际参数的值,给形式参数。
14.无类型指针
常用在编程编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。
15.void
(1)对函数返回的限定
(2) 对参数的限定
五.malloc使用的注意事项
1.(1)申请了空间
* (2)一旦用malloc,一定要注意内存泄漏问题
* (3)malloc可能会失败,要对返回值做判断
eg:pstr = (char*)malloc(128);
(4)程序不会主动释放,linux的话,程序结束后,系统会回收该空间
int *a = (int*)malloc(3*sizeof(int))
六.野指针
1.野指针
char *p; //p的值是随机的
2.解决方法
char *p = NULL;
char *p = (char*)malloc(128);
3.产生的原因
(1)指针定义时被初始化。
(2)指针被释放时没有置空。
(3)指针操作超越变量作用域。
七.函数的总结
1.什么是函数
函数是一个功能模块,它把实现某个功能的代码快包含起来,并起个函数名,供别人调用,如printf函数,如system函数,是程序运行当中包装起来的一个步骤。
2.为什么要调用函数
(1)代码好看
(2)容易定位问题
(3)可复用性强
(4)分工
3.如何定义一个函数
返回值 形式参数 函数名 函数体 代码块
4.函数可以多级调用
5.形式参数局部变量
(1)生存期
(2)形式参数灵活
(3) 此时内存有两个相同,形式参数