
c语言
文章平均质量分 50
sophia__yu
想要获得,便得付出。
展开
-
无符号int、有符号int、无符号char、有符号char范围
计算机以二进制补码存储数值,当一个具有符号位的数据值储存在计算机中的时候,计算机会以最高位为符号位,其余位数取该数绝对值的二进制补码来储存。 有符号char范围: 有符号char最大值(正数):0111 1111即127,最小值1000 0000(补码) 即-128。 注1000 0000 -1=0111 1111 即2^7-1=128-1=127; -128即- 2^7; 所以有符号...原创 2018-07-24 19:26:19 · 35452 阅读 · 2 评论 -
柔性数组
柔性数组是结构体中最后一个元素是未知大小的数组,可以是a[0],a[ ]。第一种;第二种:含有柔性数组的结构体大小:柔性数组的特点:结构中的柔性数组成员必须至少有一个其他合法成员;结构体大小不包括柔性数组大小;包含柔性数组成员的结构体用malloc函数进行内存的动态分配,并且分配的内存应大于结构的大小,以适应柔性数组的预期大小。如果想要一个结构体中数组变大变小 ,有两种方法:方案一:这种方法需要两...原创 2018-03-20 21:49:16 · 854 阅读 · 0 评论 -
实现一个动态通讯录
通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址上篇博客介绍动态函数,malloc和realloc,博客链接:http://blog.youkuaiyun.com/sophia__yu/article/details/79508975代码中将使用malloc和realloc函数:头文件和结构体:main函数:find函数:add函数:delete函数:修改函数:sear...原创 2018-03-11 22:09:24 · 427 阅读 · 0 评论 -
malloc 、calloc、realloc
malloc和freec库分别提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。这个函数向内存申请一段连续可用的内存,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。同时,malloc实际分配的空间有可能比申请的要大,但取决于编译器。如果开辟失败,则返回一个NULL指针,所以,对返回指针做好检查,确保是空还是非空。由于malloc返回值为void *,...原创 2018-03-10 19:19:57 · 265 阅读 · 0 评论 -
联合体 利用联合体判断大小端
联合体定义联合体和结构体一样都是自定义类型。联合体也包含一系列成员,但是和结构体不一样的是这些成员共用一个空间。也就是说联合体内,任意一个成员地址在数值上都相等。请看联合体的声明:利用联合体判断大小端先请看下列代码:由此,可以利用联合体判断大小端:同理,还有另一种方法判断大小端:联合大小的计算结构体存在内存对齐,那联合存在吗?由于联合中各成员共用同一段空间,所以联合长度至少可以容纳最大的成员。但是...原创 2018-03-10 16:05:23 · 6232 阅读 · 4 评论 -
枚举
枚举类型定义枚举就是把可能的取值全都列举出来,比如,将一周七全都列举出来 :enum day 是枚举类型,相当于int;{ }中的内容是枚举类型的可能取值,是枚举常量。这些可能值都是有值的,默认从0开始,一次加1,当然也可以赋值为其他数字,但是依然是递增1。枚举使用枚举优点我们知道可以用#define定义常量,但是当为什么要用枚举?当写到大程序时,有很多相同类型常量,就可以用枚举定义出很多常量,这...原创 2018-03-10 14:26:15 · 296 阅读 · 0 评论 -
位段
我们已经了解了结构体,位段 和结构体类似,但是依然有不同之处:1.位段的成员必须是int、unsigned int 、signed int、char(属于整型家族)。2.位段的成员后边有一个冒号和一个数字(数字代表如果是32位bit位可以使用的权限)。结果为:8。解释如下:位段的内存分配:1.位段的成员可以是int、unsigned int 、signed int、char(属于整型家族)。2...原创 2018-03-08 20:38:54 · 2593 阅读 · 1 评论 -
结构体(声明、初始化、内存对齐、如何传参)
结构基础知识聚合数据类型能够同时存储超过一个的单独数据。C提供了两种类型的聚合数据类型,分别是数组和结构体。数组是相同元素的集合,它的每个元素是通过下标引用或指针间接访问的。结构体也是一些值的的集合,这些值称为它 的成员,但一个结构的成员可能具有不同的类型。数组元素可以通过下标访问,这是因为数组元素长度相同,但在结构体中并非如此,由于每个成员的类型可能不同,那么长度也就可能不同,所以就不能通过下标...原创 2018-03-08 19:31:10 · 21912 阅读 · 6 评论 -
使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。 例如:命令行参数输入:test.exe -a 1 2 执行1+2输出3 结果为:...原创 2018-03-01 16:39:01 · 328 阅读 · 0 评论 -
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。编程实现。
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。编程实现。 分析:两个空瓶子可以换一瓶汽水,3个空瓶子会换1瓶,汽水4个空瓶子会换2瓶汽水,只要空瓶子数大于1,就可以再喝汽水。...原创 2018-03-01 15:30:54 · 779 阅读 · 0 评论 -
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
1.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。 分析:异或,相同为0,不同为1。0和任何数据异或都为该数据。将数组整体元素异或:可得出,异或结果肯定不为0;结果肯定是不同数据异或结果,而且是这两个数据不同部分异或结果;从低位开始按位与1,若结果为0,说明该位数据不同;根据该位,将数组分为两部分,一部分是该位为0,另一部分该位为1,每一部分都有一个不同数...原创 2018-03-01 13:24:38 · 1282 阅读 · 0 评论 -
写一个递归函数,输入一个非整数,返回组成它的数字之和。编写逆置函数,用递归实现,不能用C库函数。
1.写一个递归函数,输入一个非整数,返回组成它的数字之和,如1729 1+7+2+9=19编写逆置函数(reverse_string(char *str))),用递归实现,不能用C库函数。原创 2018-02-28 21:56:05 · 428 阅读 · 0 评论 -
左旋字符
1.实现一个函数,可以左旋字符串中的k个字符。 ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 分析:左旋一个字符可以理解为左旋两次,左旋两个字符可以理解为左旋2次。那左旋一次就相当于将除了最左边一个字符,其余字符向左移动一个位置,然后把最左边字符放在最右边,如将ABCD左旋一次,将BCD向左移动一个位置,A放在最右边;左旋两次相当于除了左边两个字符,其余字符向左移动一个位置,...原创 2018-02-28 20:31:53 · 392 阅读 · 0 评论 -
内存操作函数(memcpy、memmove、memcmp、memchr、memset)
存在内存操作函数的意义:对任何类型都适用,只要按照字节操作。memcpy函数:注:memcpy函数从src的位置向后复制count个字节到dest的内存位置;这个函数在遇到'\0'不会停下来;如果src和dest有任何的重叠,复制的结果都是未定义的。有以上代码可知:memcpy可以将整个结构体拷贝给另一个结构体。当然也可以拷贝整个数组及其他。memmove函数:和memcpy的差别是memmove...原创 2018-02-28 13:31:42 · 1035 阅读 · 0 评论 -
字符串函数(strlen、strcmp、strcat、strncat、strncpy、strncmp、strchr、strrchr、strpbark、strstr、strspn、strcspn等)
有的字符串函数相比大家都很熟悉,这里将strlen,strcat等字符串函数的注意点说明一下。首先,先看一下strlen函数:但是请看下列这种情况:为什么是较长的是“good day”呢?因为strlen函数的返回值是无符号整数,无符号数相减也是无符号数,即被减数若小于减数结果仍大于0。strcat函数:strcat函数用于字符串的拼接。但是strcat可不可以自己给自己拼接呢?是不可以的,str...原创 2018-02-27 22:36:09 · 4822 阅读 · 1 评论 -
指针和数组相关习题
我们学完了指针和数组,现在做些习题巩固下自己:1.&数组名和数组名的区别:2.结构体指针:注:结构体指针p:p+1指加20,20的十六进制为14;只有指针类型的变量+1等于加其所指类型的大小 ,除此之外+1为正常的加1。所以,(unsigned long)+1就是简单加1。3.将变量字节化:画图解释为:4:逗号表达式:首先,逗号表达式是指,以( )括着,中间以逗号隔开的表达式。形如(x,y...原创 2018-02-26 12:56:54 · 397 阅读 · 0 评论 -
回调函数(模拟实现qsort,采用冒泡的方式)
回调函数是一个通过函数指针调用的函数。如果把函数指针(地址)作为参数传给另一个函数,当这个指针被用来调用其所指的函数时,称为回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。首先,了解下qsort函数:利用qsort写代码:如果数组类型为float呢?下面模拟实现qsort(采用冒泡的方式):请看下列代码:结果为:如果是指针数...原创 2018-02-25 22:41:15 · 325 阅读 · 0 评论 -
函数指针数组的应用:转移表
用计算器的代码说明函数指针数组,请看下列代码:1.用switch case语句写计算器:2.用函数指针数组写计算器结果如下:以上就是函数指针数组的应用。原创 2018-02-23 22:25:09 · 345 阅读 · 0 评论 -
数组指针、指针数组、函数指针、函数指针数组、函数指针的数组的指针
指针数组:正如可以创建整型数组,也可以创建指针数组。指针数组是数组,是一个存放指针的数组。请看下列例子:int *arr1[10];char **arr2[10];两个都是指针数组。数组指针:数组也是一种类型,也可以创建数组指针。数组指针是指针,是指向数组的指针。请看下列例子:int (*p)[10];是数组指针,是一个指向10个整型元素数组的指针。那如何区别数组指针和指针数组呢?这里有一个小技巧...原创 2018-02-19 18:32:40 · 761 阅读 · 2 评论 -
栈帧的深入了解
栈帧指esp和ebp两个寄存器所表示的内存空间称为改函数的栈帧。每一个函数调用都会形成新的栈帧。首先,让我们来了解下程序的地址空间以此代码展开讨论: 本次主要了解栈:1:定义a,b变量2:形参实例化:形参入栈(入到main函数的栈顶)3.call命令4.ebp入栈并和esp在同一位置5.形成myadd的栈帧,定义myadd函数里的z变量...原创 2018-02-02 20:46:58 · 603 阅读 · 0 评论