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;

二.单字符输入输出

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()的区别在于后者输出字符串会自动换行;
posted @ 2020-03-15 18:29  ABClazyboy  阅读(344)  评论(1编辑  收藏  举报