tips
一、函数重载
在程序编译时分为四步:预编译 编译 汇编 链接而C++的函数重载与C的区别就在于链接生成符号表时
C : 0x000000 : Add C语言中, .o文件符号表中地址对应的函数名为 自己创建的函数名,所以不能创建同名函数
C++: 0x000000 : _Z3Adddd 和 _Z3Addii _Z为标志符,3为函数字符数,Add为函数名,ii为两个参数类型
由以上分析,我们可以知道函数重载的实现的重点为参数
数量or顺序or类型不同时就能构成重载
注意,如果构建两个函数名相同的函数,若只有返回值类型的不同无法构成重载因为其与参数无任何关系
二、缺省函数
123456789101112131415161718int Func1(int a = 10, int b = 20,int c = 30) { return a + b;}int Func2(int a , int b = 20, int c = 30){ return a + b;}int main(){ Func1(); Func1(3 ...
常见多种排序方式和实现
头文件(Sort.h)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#pragma once#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<time.h>#include<string.h>void PrintArray(int* arr,int n); //打印数组void Swap(int* a, int* b); //交换数据//默认全部实现升序排列//插入排序void InsertSort(int* arr,int n); //插入排序 : 稳定 最坏O( N^2 ) 最好O( N )void ShellSort(int* arr, int n); //希尔排序 : 不稳定 ...
数据结构常见类型的搭建
一、栈
头文件(Stack.h)123456789101112131415161718192021222324252627282930#pragma once#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int StackData;typedef struct Stack{ StackData* _a; //存放数据 int _top; //顶标 int _capacity; //存放数量}Sta;void StackInit(Sta* pst); //初始化堆栈void StackDestroy(Sta* pst); //销毁堆栈void StackPush(Sta* pst,StackData x); //插入数据void StackPop(Sta* pst); //删除数据int StackSize(Sta* pst); //堆栈数据个数// int St ...
通讯录
一、项目头文件(project.h)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>#include<assert.h>enum inputnum //输入数字{ Exit, Add, Del, Query, Modify, Sort, Display, Reset};enum MAX //字符串的最大大小{ Name_MAX = 20, Sex_MAX = 5, Adress_MAX = 30, Tel_MAX = 20,}; ...
程序环境和预处理
一、翻译环境和执行环境
翻译环境:在这个环境中源代码被转换为可执行的机器指令执行环境:用于实际执行代码
具体什么意思我们通过画图来解释
1.翻译环境
翻译环境分为两步,编译和链接
那么编译和链接是什么呢,同样以图来说明
那么问题又来了,编译和链接的过程中发生了什么
由于编译和链接内部需要Linux环境深入了解,这里直接上定义
2.执行环境简述一下程序执行的过程
1.程序必须载入内存中.在有操作系统的环境中:一般由操作系统完成在独立的环境中:程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存完成2.程序执行便开始,调用main函数3.开始执行程序代码.这个时候程序将使用一个运行的堆栈(stack)(堆栈就是栈),存储函数的局部变量和返回地址.程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值.4.终止程序.正常终止main函数,也可能是意外终止.
以上
二、预处理详解
1.预定义符号12345__FILE__ //进行编译的源文件 %s__LINE__ //文件当前的行号 %d__DATE__ // ...
文件
一、什么是文件
磁盘上的文件就是文件但在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(功能角度分类)
1.程序文件
包括源文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)
2.数据文件
文件的内容不一定是程序,而是程序 运行时读写的数据,比如程序运行需要从中读取数据的文件或者输出内容的文件
本文主要以数据文件为中心进行简介
3.文件名文件名包含三个部分
文件路径+文件主干+文件后缀eg: C:\code\test.txt路径: C:\code文件名主干: test文件后缀: .txt
二、文件的打开和关闭
1.文件指针
每个被使用的文件都在内存开辟了一个相应的文件信息区用来存放文件的相关信息(文件名,文件状态,文件当前位置等).这些信息是保存在一个结构体变量中的.该结构体系统声明取名为 FILE即 FILE 是一个结构体类型
具体内部实现如下(不同环境下,结构成员会有所差异))
12345678struct _iobuf{ //文件相关信息 // //};typed ...
动态内存分配
一、栈区,堆区,静态区(数据段)
二、malloc
该函数原型为
1234#include<stdlib.h>#include<malloc.h>.void * malloc(size_t size);
该函数作用为
在堆区开辟size个字节的空间开辟成功返回开辟的地址开辟失败返回空指针
实际应用如下
1234567891011121314151617181920212223int arr[10];int *p = (int*)malloc(10*sizeof(int));//开辟十个整形空间,强制转换位int* 类型方便接收和处理//如果开辟失败if(p == NULL){ perror("main"); return 0;}//使用int i = 0;for(i = 0; i < 10; i++){ printf("%d",p[i]); //p[i] == *(p+i)}//回收空间free(p); //若不回收,会导致内存泄漏p = NULL; //手 ...
自定义类型
一、结构体
1.匿名结构体类型我们来举个例子介绍匿名结构体
1234567struct //创建时只有关键字,即为匿名结构体{ char a; int b; char c; double d;}s;
再来列举一个匿名结构体常见的错误
12345678910111213141516171819202122struct { char a; int b; char c; double d;}s; struct { char a; int b; char c; double d;}*p; //用p指向这个匿名结构体int main(){ p = &s; //观察两个匿名结构体发现组成成分一样,是不是就可以通过这种方式使 p 指针存储 s 呢? //error 虽然类型一样,但是在编译器看来这是两个不同的匿名结构体,非法 return 0;}
2.结构体的自引用举个例子来看看结构体如何相互引用
1 ...
常见函数和模拟实现
前言: 学习C语言的过程中模拟实现各种库函数可以让我们了解更加底层的原理,在这里我整理了部分函数的模拟实现和注意事项.
一、strlen1.函数介绍strlen的原型为
123#include<string.h>.int strlen(char *str);
.
其作用和原理是
传入要统计字符串的地址 统计该字符串’\0’(字符串结束标志)前的字符个数
2.模拟实现① 指针计数器方式1234567891011int my_strlen(const char *str){ assert(str); //判定不为空指针再运行 int count = 0; //count作为计数器 while(*str != '\0') //若str解引用不为字符串中的'\0' 则停止 { count++; str++; } return count;}
② 函数递归方式123456789101112131415161718int my_strlen(const c ...
指针
一、 指针指向字符常量12345678910111213char *pc1 = "9TSe";char *pc2 = "9TSe";//pc1和pc2指向的地址是相同的(相同字符串,系统为了节省空间就没有再开辟空间//有些编译器在写以上代码时会报错//以下是解决方式const char *pc1 = "9TSe";const char *pc2 = "9TSe";//因为 指针指向的是字符常量,不可修改,编译器认为其不安全,故报错//加上const修饰即可
二、 指针、数组
1. 指针数组
指针数组是一个数组数组里面存放着指针
1234567int a[3] = {1,2,3};int b[3] = {4,5,6};int c[3] = {7,8,9};int* arr[3] = {a,b,c}; //数组名即为数组首元素地址//arr就为有三个元素,每个元素是一个指针的数组
2. 数组指针
数组指针是一个指针指向数 ...