C语言学习笔记(3)
一.动态内存分配
C99以后可以用变量做数组定义的大小。
1. malloc作动态内存分配:
- 头文件:#include<stdlib.h>
- 返回结果为void*,需要类型转换为自己需要的类型;
- 向malloc申请的空间大小是以字节为单位;
- 如果申请失败则返回0,或者叫NULL;
int *a = malloc(n * sizeof(int));
2.free ( ); //有malloc就有free
- 把申请得来的空间还给“系统”
- 只能还申请来的空间的首地址。
- 常见问题:
- 申请了没free 导致长时间运行内存逐渐下降;
- 忘了
- 找不到时机
- free过了再free;
- 地址变过了,直接去free;
- 申请了没free 导致长时间运行内存逐渐下降;
二.单字符输入输出
1. putchar
int putchar(int c);
- 向标准输出写一个字符;
- 返回写几个字符,EOF(-1)表示写失败。
2.getchar
int getchar (void);
- 从标准输入读入一个字符;
- 返回类型 int 是为了返回EOF(-1)
- 结束输入
- Unix ---> Ctrl + D
- windows --->Ctrl + Z
三.字符串数组
1. char**a:
a是一个指针,指向另一个指针,那个指针指向一个字符串;
2.程序参数
int main(int argc, char const *argv[ ])
argc[0]命令本身
四.字符串函数
string.h
1. strlen:
size_t strlen(const char *s);
- 返回s的字符串长度(不包含结尾的\0);
2. strcmp:
int strcmp(const char *s1, const char *s2);
- 比较两个字符串;
- 返回值:
- 0:s1 == s2;
- 正数: s1 >s2;
- 复数: s1 <s2;
- 返回值:
3.strcpy:
char* strcpy(char *restrict dst, const char *restict src);
- 把src的字符串拷贝到dst,
- restrict 表示src与dst不重叠(C99)
- 返回dst为了能链起代码
char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst,src);
4. strchr:
- 寻找字符
char *strchr(const char *s, int c); //从左往右找字符
char* strrhr(const char *s, int c);//从右往左找字符
- 返回指针,返回NULL表示没有找到
5.strstr:
- 寻找字符串
char *strstr(const char *s1, const char s2);
char *strcasestr(const char *s1, const char s2);//忽略字符大小写
6.strcat
- 把s2拷贝到s1后面,接成一个长的字符串;
- char *strcat( char *restrict s1, char *restrict s2);
- 返回s1;
- s1 必须具备足够的空间;
五. 我的手写笔记
六. MOOC代码
七.产生的问题
1.malloc函数
- 解决:
- 动态储存分配函数;
- 函数原型:void*malloc(unsigned size)
- 功能:在内存的动态储存区中分配一连续空间,其长度为size;
2.字符串数组
- 解决:把字符串数组看成二维字符数组
3.为什么可以分配如此大的空间
4.scanf()与gets();printf()与puts() 的区别:
- 解决:
- scanf()只能输入不带空格的字符串,而gets()没有这个限制;
- printf() 和 puts()的区别在于后者输出字符串会自动换行;