C语言基础知识和部分代码细节

菜鸟新人所作,只为方便自己回忆,如有错误,欢迎斧正!

算法

1动态规划最优子结构性质:如果问题的最优解所包含的子问题的解也是最优的。子问题重叠性质:对每一个子问题只计算一次,然后将其计算结果保存在一个表格中。无后效性:以前的各阶段状态不影响未来决策。背包动态规划复杂度为O(nc)当容量c很大时不用动态规划

1 2

C语言

 

一 概念

1  *和&    eg:int a = 10;    int *b = &a;

  a表示a对应的存储单元中的数据。 
&a表示a对应的存储单元的地址。 
*b表示:先要求b存储的是存储单元a的地址。 *b表示a存储单元中的数据

 附:数组本质上其实也是指针,即:*a 等同于 a[]
    函数返回数组可 设函数类型为int* fun(){ int r[] ;  return r ;}

附:const int * ptrint const * ptr完全等价,指向整型常量整型指针ptr

  int * const ptr声明了一个指向整型变量常指针ptr

 

例:int a[5]={1,2,3,4,5};   int *ptr=(int*)(&a+1);   printf("%d,%d",*(a+1),*(ptr-1));

 答案2,5。 &a+1不是首地址+1,系统会认为加一个a数组的偏移,ptr=&(a[5])

2  字符串:C 语言中,字符串是使用 null 字符 '\0' 终止的一维字符数组

      C++ 字符串除字符数组还可用string类

printf输出用%s  输出会逐个扫描字符,直到遇见 '\0' 才结束输出

字符串给字符数组赋值时自动添加 '\0',数组长度要比字符串长度大1字符串长度不包括 '\0'

 附: 1)使用字符数组时的库函数(C:#include <string.h> C++: #include <cstring>):

复制s2到s1: strcpy(s1, s2);  连接s2到s1: strcat(s1, s2);  长度: strlen(s1);

返回int型 s1-s2: strcmp(s1, s2);   返回指针 s1中第一次位置: strchr(s1, ch);

返回指针 s1中s2第一次出现位置: strstr(s1, s2);

  1. C++的string类 #include <string>:复制用= ;连接用+ ;长度用.size();

3 结构体:成员访问运算符(.)

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明

附:

4 typedef是在基本类型的基础上定义类型的同义字eg:typedef int a //a等同int

struct前加typedef 则最后的结构体变量名变为结构体类型名

typedef 仅限于为类型定义,#define定义类型或数值 eg:#define N 1;

typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

 

5 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值

共用体定义和 结构体类似,访问用 ( . )

6 1) 定义枚举 enum类型: 默认第一个元素为0,后续元素为前元素加一

Eg:enum season {spring, summer=3, autumn, winter};  则:spring=0,autumn=4

  1. 定义枚举变量:enum DAY day; 或类型变量同时定义enum DAY{...} day;
  2. 枚举类型连续才能遍历:eg:enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;

  for (day = MON; day <= SUN; day++) { printf("%d ", day); } 输出1234567

7 1) static全局变量与普通的全局变量: 全局变量本身就是静态存储方式,当源程序由多个源文件组成,非静态全局变量在各个源文件中都有效。静态全局变量只在定义该变量的本源文件内有效。static全局变量只能初使化一次。总之改变作用域,生存期不变。

2) 静态局部变量将生存期变为整个源程序(以前退出函数消失),作用域不变

3)  static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

4) 局部变量在中,全局变量在静态区 中,动态申请数据在堆中

10 "位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域 的位数  定义和结构体相仿,成员:类型 位域名: 位域长度 (用./->访问)

11 算法更优:用>>和<<代替/和* ;用&7代替%8

12 中断服务子程序(ISR)

  1. ISR没有参数和返回值  2) 尽量不要使用浮点数处理程序

13 预编译:展开宏定义,删除注释,处理#include预编译指令,处理条件编译指令 如#id #ifdef,添加行号和文件名标识

编译:进行词法分析、语法分析、语义分析及优化后,生成汇编代码文件

汇编:将汇编代码转变成机器可以执行的指令(机器码文件)。

链接:将各个模块之间相互引用的部分正确的衔接起来。包括了地址和空间   分配、符号决议和重定向

二 编码

注:vc编码快捷键:

1)注释:先CTRL+K+C ;       取消注释:先CTRL+K+U

 

1, Q:黑框一闪而过

A: 开头 #include<stdlib.h>    return前加 system("pause");

Q: vs报错:转换到COFF期间失败

A:项目属性-清单工具-输入输出-嵌入清单是改否

2 Q: continue与 break用法

  A: continue结束本次循环,跳过后面语句进入下一次循环,用于(while,do,for)

    Break循环结束

 3 预处理命令必须以#开头 无分号包括:宏定义,文件包含,条件编译

(程序处理顺序:预处理,编译汇编,连接)

4 字符串输入输出函数 gets() <可空格不可回车> puts()<可空格不可空字符>

Eg: char str[1000];  gets(str);(gets()将回车'\n'作为输入字符数组)

附:scanf("%s", string);(不录空格 且空格或回车'\n'仍在缓存区)

printf(“%s”,str)和puts(str)均是输出到'\0'结束,遇到空格不停,但puts(str) 会在结尾输出'\n',printf(“%s”,str)不会换行 

  字符输入输出函数<一个字符>  c=getchar()  putchar(c)

5 Q:输入int型 跳行<字符串用gets>

  A:    int ch;

        do {

            scanf("%d",&data[i]);

            i++;

        }while((ch=getchar())!='\n');

注:输入多行数据while(scanf("%d",&n)!= EOF){...}

6分割://char *strtok(char *s1, const char *s2)

                         //该函数作用是提取以s2为分隔符的字符串,并s2替换为‘\0’

                         //规定进行子调用时(即分割s1的第二、三及后续子串)第一参 数必须是NULL

                        //在每一次匹配成功后,将s1中分割出的子串位置替换为NULL(摘 下链中第一个环),因此s1被破坏了

                       //函数会记忆指针位置以供下一次调用,当查找不到s2中的字符时, 返回NULL

char *p;

p=strtok(tmp,",");

        while(p)

        {

            strcpy(s[i],p);  //复制字符串

            i++;

            p=strtok(NULL,",");

        }

比较字符串返回int型eg:strcmp(s[k],s[k+1]) if(strcmp(s[k],s[k+1])>0)

 

6 Q:浮点型scanf("%lf%lf",&a,&b);  printf("%lf %lf\n",a,b);  换成%f不行

  A:用double定义a 则用%lf ;  flout型 的可以用%f,也可以用%lf

7 Q:字符串数组长度  <sizeof是内存不是元素个数>

  A:#include<string.h>  char input[10000];    length = strlen(input);

8 时间之差用时分秒换算成秒再取模  eg:  minute = sum%3600/60    

second = sum%3600%60

9 结构体 typedef struct{

...}time;  time result;  result.* ==...  <*代表结构体中元素>

 

12代码细节

  1. char * const p; //常量指针,p值不可改;  char const * p;//指向常量的指针

 

 

 

13 c语言有符号数和无符号数进行比较运算时(==,<,>,<=,>=),有符号数隐式转换成了无符号数。   eg:int a=-14;  a>6;  -14的补码为1111111111110010。此数进行比较运算时,被当成了无符号数,它远远大于6

14 一、库函数<stdlib.h>

  1. 字符串转浮点型:double atof(const char *str)
  2. 字符串转int型:int atoi(const char *str)

二、库函数<string.h>

1)复制s2到s1: strcpy(s1, s2); 2)连接s2到s1: strcat(s1, s2); 3)长度: strlen(s1);

4)返回int型s1-s2: strcmp(s1, s2); 5)返回指针s1中第一次位置: strchr(s1, ch);

6)返回指针 s1中s2第一次出现位置: strstr(s1, s2);

7)分隔符(s2)分隔s1成多个字符串 char *strtok(char *s1, const char *s2)

注:每次返回第一个子串的指针,从第二次调用strtok()将参数s1设置成 NULL。每次调用成功则返回指向被分割出片段的指针。

Eg:char dest[]="ab,cd,ef,c";  char* rp;  char ch[]= ",";  rp=strtok(dest, ch);     while(NULL != rp) {  printf("dest: %s ", dest);       

 printf("rp: %s \n", rp);  rp=strtok(NULL, ch); }                        

 

15  1)文件打开 FILE *fopen( const char * filename, mode );//字符串目录和模式

mode: r//只读; w//只写,不存在则新建; a//追加模式写; (有+则允许读写)

Eg:FILE *fp = NULL; fp = fopen("/tmp/test.txt", "w+");

  1. 文件关闭fclose(文件名);
  2. 写入文件:int fputs( const char *s, FILE *fp );把字符串s写入,成功返回正 数;失败返回EOF

附: int fprintf(FILE *fp,const char *format) 写入字符串

  1. 读取文件:char *fgets( char *buf, int n, FILE *fp );读取 n - 1 个字符并在最后追加一个 null 字符来终止字符串;读取时遇到换行符 '\n' 或文件末尾 EOF,则只会返回读取到的字符,包括换行符

附:fscanf(FILE *fp, const char *format, 串名) 读取字符串,遇到空格换行符停止读取。  eg:   fscanf(fp, "%s", buff);

  1. 二进制文件读取用:fread和fwrite

16错误处理:C提供了 perror() 和 strerror() 函数来显示与 errno 相关的文本消息。

17内存管理

内存管理MMU的作用:内存分配和回收,内存保护和扩充,地址映射 

  1. void *calloc(int num, int size);动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0;共分配了 num*size 个字节长度的内存
  1. void free(void *address); //释放内存
  2. void *malloc(int num); //在堆申请指定大小内存eg:d= (char*)malloc(sizeof(char));
  3. void *realloc(void *address, int newsize); //内存重分配

c++:

1 #include<iostream>  using namespace std;   cout << "Hello" << endl;

2 指针: int a;  int *p;  p = &a;   <p是a内存地址,*p是a>

   指向类的指针访问成员与结构体一样用->

3 范围解析运算符 ::   

 :: 运算符之前必须使用类名。类用::  对象用 .

4 普通成员变量如果是每个对象私有的,一般通过类的构造函数进行赋值,

构造函数名字与类名相同

静态成员在类外定义 无论创建多少个类的对象,静态成员都只有一个副本

静态常成员变量:可以直接在类中初始化和声明,在类定义体外进行定义

5 protected 成员可以被派生类访问(:)    eg  class B : public A{};

  Private成员不能被派生类访问(可以被友元函数访问)

6 构造函数和拷贝构造函数 classname (const classname &obj) { }

  类的构造函数在创建一个新的对象时调用。类的析构函数在删除对象时调用。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_46424136/article/details/106845931