C语言
文章平均质量分 56
qq_40395404
这个作者很懒,什么都没留下…
展开
-
可变参数列表,stdarg
所谓“可变参数列表”就是指函数的形参的数目和类型是不确定的。printf函数就是一个可变参数的函数,第一个参数是格式化字符串,后面可以跟任意数目的参数。而我们平时使用的函数,其参数的数目和类型都是固定的,一旦声明,无法改变。1.计算一系列值的平均值(注意:这些值不是保存在数组中的,而是在参数中显示的传递)float average( int n_values, int v1, int原创 2017-10-17 01:24:17 · 167 阅读 · 0 评论 -
Malloc(),realloc(),calloc(),free()的用法及含义
Malloc(),realloc(),calloc(),free()的用法及含义:1. malloc(),表示动态申请内存,以字节为单位eg:#include#includeint main(){int *p=(int*)malloc(10*sizeof(int));for(int i=0;i{p[i]=0;printf("%d ",p[i]);}原创 2017-10-17 01:05:45 · 303 阅读 · 0 评论 -
typedef
typedef一、在结构体中哪些数据类型可以使用?1.基本数据类型2.上面已定义好的数据类型3.不能使用 自己定义一个自己的普通变量,但可以定义一个指向自己的指针二、结构体成员的访问1.结构体普通变量通过“.”(成员运算符)访问它的成员2.结构体指针通过“->”(指向运算符)访问它的成员eg:struct A{int a;int *b;原创 2017-10-17 01:15:50 · 113 阅读 · 0 评论 -
string相关的函数
1. strlen:计算字符串长度.(不包含'\0')eg:int Mystrlen(const char *str){assert(str != NULL);//不可以传空指针int i = 0;while(*str!='\0')//遇'\0'时结束{i++;str++;}return i;//字符串有效长度,不包含'\0'}2. strcpy原创 2017-10-17 01:17:27 · 449 阅读 · 0 评论 -
内存重叠
内存重叠要考虑拷贝数据的方向。往前移,先移动前面的数据;往后移,先移动后面的数据。eg:#include #include #include //n表示数组长度//m表示需要移到的后半段的数据长度(把数组中后m个数据放到数组最前面)void Move(int *arr,int n,int m){if(arr==NULL || n{return原创 2017-10-17 01:22:03 · 212 阅读 · 0 评论 -
结构体的大小
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。内存对齐的原因: 1)某些平台只能在原创 2017-10-17 01:19:28 · 231 阅读 · 0 评论 -
指针和引用的区别
指针和引用的区别:相同点:1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。区别:1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变;4. 引用没有 const,指针有 const;5. 引用不能为空,指针可以为空;6.原创 2017-11-21 12:14:35 · 187 阅读 · 0 评论 -
对文件操作详解
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:文件的打开操作 fopen打开一个文件文件的关闭操作fclose 关闭一个文件文件的读写操作:fgetc 从文件中读取一个字符fputc 写一个字符到文件中去fgets 从文件中读取一个字符串fputs 写一个字符串到文件中去fprintf原创 2018-02-05 17:18:57 · 830 阅读 · 0 评论 -
c/c++程序加载过程
C/C++程序编译流程(预处理->编译->汇编->链接)1. 预处理预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。1.读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理 2.将所有的“#define”删除,并且展开所有的宏定义...原创 2017-10-20 00:47:40 · 1596 阅读 · 0 评论 -
排序算法
插入排序:直接插入:思想:假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。ways1:void insertSort1(int arr[], int len){ int i;//未排序序列带排序的元素下标 int j;//已排序序列最大元...原创 2017-11-11 01:55:15 · 163 阅读 · 0 评论 -
字符串拷贝和内存拷贝的区别
strcpy与memcpy区别:1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy...原创 2018-07-18 16:54:20 · 1129 阅读 · 0 评论 -
指针加减
1.指针±指针指针+指针 错误指针-指针 得到之间间隔的单元个数。1)、算出间隔的字节数2)、除以调整的权重eg:#include <stdio.h>#include <stdlib.h>int main(){int arr[10] = {};//xint *p = &arr[1];//x+4int *q = &arr[9];...原创 2017-10-17 00:53:59 · 136 阅读 · 0 评论 -
assert and const
assert:1、assert:断言,断定该结果一定成立,如果表达式为真,则忽略,否则程序崩溃,指出错误的地方2、将版本改为release,所有的断言自动失效3、assert与if放在一起使用eg:char *Mystrcpy(char *des,char*src) //谨记:返回的是指针型,一定要加*Mystrcpy//参数检查,使程序具有健壮性/鲁莽性{char原创 2017-10-17 00:49:14 · 324 阅读 · 0 评论 -
函数指针
函数指针:即指向函数的指针1.求两个整形数据的最大值,最小值,平均值#includeint Max(int a,int b){ return a>b ? a : b;}int Min(int a,int b){ return a}int Avg(int a,int b){ return (a+b) / 2;}void Show(int a原创 2017-10-17 01:28:47 · 120 阅读 · 0 评论 -
判断回文问题
1.数组(判断第一位与倒数第一位的数是否相等,第二位数与倒数第二位数是否相等,...)#include<stdio.h>#include<stdlib.h>bool Is_Hui(char *str,int len){ for(int i=0;i<len;i++){ if(*(str+i) !=*(str+len-1-i)) retu...原创 2017-10-17 01:30:25 · 362 阅读 · 0 评论 -
判断等式进制问题
判断一个等式采用几进制:EG:假设在n 进制下,下面的等式成立,567*456=150216,n的值是(B)A.9 B.10 C.12 D.18 解:(5n^2+6n+7)*(4n^2+5n+6)=20n^4+49n^3+88n^2+71n+42=n^5+5n^4+2n^2+n+6两边同时对n原创 2017-10-17 01:34:40 · 308 阅读 · 0 评论 -
柔性数组
柔性数组:也叫伸缩性数组,也叫变长数组Eg:Struct MyStruct{Int a;Double b;Char c[];//or char c[0];也可以用其他数据类型};C不占用MyStruct的空间,只是作为一个符号地址存在,而且必须是结构体的最后一个成员。柔性数组,它只能放在结构体末尾,是申明一个长度为0的数组,就可以使得这个结构体是可变原创 2017-10-17 01:37:04 · 197 阅读 · 0 评论 -
左右值问题
左右值问题Eg:int a=5则++(a++)的值是(D)A.5 B.6 C.7 D.编译出错解释1:++是一目运算符,自增运算,它只能作用于一个变量,++(a++)中a++优先,是表达式,不能对表达式进行前加运算解释2:a++返回的是右值,而我们不能对一个右值进行自增操作,故++(a++)会报错后置a++相当于做了三件事:1.tmp=a原创 2017-10-17 01:38:15 · 451 阅读 · 0 评论 -
常量指针,指针常量
指针常量:关键字顺序为*、const(和中文顺序一致)例如:int *const a,表示指针a是一个常量,初始化后不可以改变,但是指向对象的值可以修改常量指针:关键字顺序为const、*例如:const int *a(等同于int const *a),表示指针a所指向的对象是一个常量,但是指针a可以指向其他对象,如*a=10;是错误的,a=b;是可以的。原创 2017-10-17 01:39:20 · 140 阅读 · 0 评论 -
从c语言中常用变量的生命周期,作用域,默认值,内存区域及链接属性
一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一...原创 2017-10-17 01:12:36 · 262 阅读 · 0 评论 -
数据类型的隐式转换
表达式会包含隐式类型转换,它由编译器自动执行,不需程序员介入。何时发生隐式类型转换1. 在混合类型的表达式中,操作数会被转换为相同类型int ival; double dval; ival >= dval; // ival converted to double2. 条件表达式会被转换为bool类型。int ival; if (ival) // ival c原创 2017-10-17 01:35:46 · 331 阅读 · 0 评论 -
C/C++变量及函数的命名规则
一、C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始; 2. 不能以数字开始; 3. 一般小写; 4. 关键字不允许用(eg:int float=2//error float 为保留字不允许用); 二、函数名的命名规则 1.见名知意; 2.自定义函数函数名首字母大写(库函数里的函数名都是以小写字母定义,为了区分库函数和自定义函数,避免冲突)。 三、宏定义里...原创 2017-10-17 00:41:23 · 33992 阅读 · 0 评论 -
大小端问题
数组在内存中的存储地址:数据在内存中的两种存储形式:小端:低地址放小数据(数据在内存/PC中以小端的形式储存,x86系统下)大段:低地址放大数据(unix,网络字节序)Eg: eg:写程序检测当前系统的大小端模式:1.用移位法:#include<stdio.h>int main(){unsigned int a=1;a>>=8...原创 2017-10-17 00:45:15 · 349 阅读 · 0 评论 -
指针的易错点
内存泄漏:在c/c++中,内存管理器不会帮你自动回收不再使用的内存。如果你忘记了释放不再使用的内存,这些内存就不能被重用了,造成内存泄漏。 内存越界访问:读越界:即读了不属于自己的数据。如果所读地址无效,程序立即崩溃;如果所读地址有效,在读的时候不会马上出现问题,但由于读到的数据是随机的,因此也会造成不可预料的后果。写越界:又叫缓冲区越界,所写入的数据对别的程序来说是随机的,他...原创 2018-07-19 16:14:48 · 237 阅读 · 0 评论