![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
文章平均质量分 59
午饭要阳光
热爱编程
展开
-
大数运算
一、为什么要有大数运算 在C/C++编程语言中,整型的最大存储类型是long long类型,大小是8个字节,一但超出这个范围,则就无法用编程语言的内置类型存储。因为编程语言的存储范围有限,所以它不能满足较大规模的高精度的计算,于是就产生了大数运算这种方法。二、大数运算原理 由于内置类型的存储范围有限,所以我们可以将大数转换成字符串存储在数组里面,然后再对每一位做单独的加减乘除运原创 2017-05-31 18:47:14 · 1790 阅读 · 0 评论 -
披着函数外衣的关键字
首先我们必须知道,sizeof()是一个关键字而不是一个函数,这一点我们可以证明:int main(){ int a = 5; short b = 3; printf( "%d\n", sizeof (b = a + 2)); printf( "b=%d\n",原创 2016-05-11 12:54:01 · 558 阅读 · 0 评论 -
static extern volatile
static:作用:1、进行内部链接指定(将全局变量或者函数限定为在本文件内可用) 2、改变局部变量的生命周期 3、改变存储类型使得局部变量存储在静态区,在整个程序结束时才释放 4、定义一个变量时,加上static前缀,定义的变量默认初始化为0;extern:1、进行外部链接指定(使得全局变量或者函数在其他文件内也可原创 2016-05-11 12:57:18 · 563 阅读 · 0 评论 -
c语言大杀器——指针详解
一、指针1、指针的概念:用来保存地址的“变量”叫做指针,可以理解成指针是地址的一个别名。例:定义一个整形指针2、“指针的内容”,“指针所指向的内容”,“指针变量的地址” (1)、指针的内容: 指针变量p里面存放的是a的地址,也就是0x0018ff44. (2)、指针所指向的内容:原创 2016-05-12 12:51:54 · 1747 阅读 · 0 评论 -
字符0,数字0,‘\0’,NULL
原创 2016-05-12 23:18:26 · 608 阅读 · 0 评论 -
char为什么取值-128——127
所以当char 类型的变量取值超过这个范围时,会发生截断.例:char a=128 00000000 00000000 00000000 10000000发生截断后取低8位为 10000000,即表示的是-128; 同样:char b=-130;截断后表示的是126.原创 2016-05-12 23:19:46 · 5058 阅读 · 0 评论 -
隐式类型转换和整型提升
c整型中的运算总是至少以缺省整型类型的精度来进行的,所以当字符型或者短整型在进行运算时为了获得这个精度,先要提升成普通整型,再运算。例: char a=127; char b=1; char ret=a+b;在进行运算时,先进行“整型提升”(提升成整形):char类型的127 是:0111 1111进行整型提升后是:0000原创 2016-05-12 23:21:01 · 740 阅读 · 0 评论 -
左值和右值
左值:能够出现在赋值符号左边的东西。他表示一个特定的位置,即左值表示一块地址。所以像:++i=10,i++=10, a+10=10....都是错误的。因为赋值号左边的东西不能表示一块地址。arr[10]=10,因为arr[10]通过下标访问一块地址,所以他是正确的。int a,b,*p;p=&a;*p=10; 指针p存储的是a的地址,当使用*p时,原创 2016-05-12 23:21:50 · 555 阅读 · 0 评论 -
内存操作函数
为什么引入内存操作函数:在定义中字符串以NUL(空字节)结尾,所以字符串操作函数遇见‘\0’停止。因此我们引入内存操作函数,来解决“非字符串类型”中遇到NUL(数字0)的情况。内存操作函数:内存操作函数与字符串操作函数非常类似,只不过内存操作函数能够处理任何类型的字节序列。在内存操作函数的参数中,有一个显示的参数说明了要处理的字节数,所以他遇见NUL不会停下来。原创 2016-05-12 23:25:19 · 1012 阅读 · 0 评论 -
如何提高循环效率
for循环的变种:某些编程环境下,为了增强for循环的灵活性,使用逗号运算符来允许更多的变量来控制循环。例:for(x=0,y=0;x+ydo{}while()循环,循环体至少被执行一次。怎样提高循环的效率: 1、在多重循环中,如果有可能,将循环次数最多的循环放在最里层,循环次数少的放在最外层,这样能够减少CPU跨切循环层的次数。例如:for(int原创 2016-05-11 12:52:58 · 2917 阅读 · 0 评论 -
计算机存储形式与进制转换
因为计算机能够识别二进制序列,所以计算机会以二进制的形式存储一个数 。对于一个正数,以原码的形式存储。对于负数,以补码的形式存储。正数的原码,反码,补码相同:例:1原码:00000000 00000000 00000000 00000001反码:00000000 00000000 00000000 00000001补码:00000000 0000原创 2016-05-13 16:51:26 · 949 阅读 · 0 评论 -
进程的地址空间
在写程序时了解每个类型的变量存储的位置是很有必要的。原创 2016-05-13 16:29:26 · 890 阅读 · 0 评论 -
C语言知识体系框架
一张图剖析c语言主要知识结构,对在c中迷茫的人或是正在复习c的人来说,很有帮助。原创 2016-05-21 13:53:18 · 10069 阅读 · 0 评论 -
内存对齐与自定义类型
一、内存对齐 (一)、为什么会有内存对齐? 1、为了提高程序的性能,数据结构(尤其是栈)应该尽可能的在自然边界上对齐。原因是为了访问未对齐的内存,处理器需要进行两次访问,而访问对齐的内存,只需要一次就够了。这种方式称作“以空间换时间”在很多对时间复杂度有要求问题中,会采用这种方法。 2、内存对齐能够增加程序的可移植性,因为不是所有的平台都能随意原创 2016-05-14 16:23:42 · 2443 阅读 · 5 评论 -
你会写“atoi”吗???
分析:1、如果输入的字符包含不是数字字符的字符??? 例如:“123adc4".针对这种情况,我们只要加上判断就行了,只要遇到不是数字字符的直接返回。2、如果在数字字符前面有正负号又该怎么办??? 例如:”-123”、“+123”.针对这种情况,我们再加上判断,判断字符串的第一个字符是不是正负号,并用一个标记位flag记录正负。3、当输入的字符串前面几个原创 2016-05-31 21:50:29 · 4009 阅读 · 0 评论 -
浮点数的存储形式
float在内存中的存储形式:先看下面一道例题: float *p = (float *)# printf( "num=%d\n", num); printf( "*p=%d\n", *p); *p = 5.原创 2016-05-12 23:27:02 · 663 阅读 · 0 评论 -
字符串函数strchr 、 strrchr 、strrstr的实现
#include#include#includechar *my_strchr(const char *dst, char c){ assert(dst); const char *pdst = dst; while (*pdst) { if (*pdst == c) return (char *)pdst; else pdst++; } return NU原创 2016-05-13 00:17:01 · 3601 阅读 · 0 评论 -
指针二三事
一、指针:用来保存地址的“变量”叫做指针,可以理解成指针是地址的一个别名。例:定义一个整形指针“指针的内容”,“指针所指向的内容”,“指针变量的地址”:指针的内容:指针变量p里面存放的是a的地址,也就是0x0018ff44.指针所指向的内容:指针变量p里面存放的地址(0x18ff44)这块空间所对应的值,也就是10,我们通过*p(解引原创 2016-05-13 00:18:07 · 4418 阅读 · 0 评论 -
宏和函数的区别
宏与函数的区别:1、宏做的是简单的字符串替换,不受类型限制;而函数是参数的传递,受到参数类型的限制。2、宏体替换宏名是在编译之前就完成的,函数参数的调用是在函数执行时将实参传给形参的。3、宏参数的替换是不经过计算的,有可能会带有副作用,所以我们在写宏体的时候一般在能加括号的地方都不要吝啬括号,但有时候这也不能解决副作用的问题。函数在传参时传的是值,不原创 2016-05-13 00:26:37 · 618 阅读 · 0 评论 -
main()函数的参数
main()函数的参数:main(int argc,char *argv[],char *envp[]);argc: 表示包含文件名在内的命令行参数的个数。argv[]是指针数组:里面存放的全是char *类型,最后放一个NULL字符结尾。argv[]存放的是包含文件名在内的所有命令行参数的首地址。envp[]也是一个指针数组:里原创 2016-05-13 16:21:37 · 1066 阅读 · 2 评论 -
可变参数列表
函数原型:列出了函数期望收到的参数数目及类型,但是它只能显示“固定数目”的参数。可变参数列表:让一个函数在不同的时刻接受“不同数目”的参数。可变参数列表是通过宏来实现的,这些宏都在stdarg.h这个头文件中,所以使用可变参数列表时要引用头文件#include。例如:求寻找一组整数中最小的值,因为整数的个数不确定,所以函数在传参的时候也是不确定的,因此需要用原创 2016-05-12 23:26:10 · 4240 阅读 · 0 评论 -
函数调用进程——栈桢
函数调用过程------栈桢例:剖析“比较两个数之间的大小关系,并把较大数返回”的调用原理:int Max(int x, int y){ int z = 0; if (x > y) z = x; else原创 2016-05-10 19:17:40 · 1660 阅读 · 0 评论 -
字符串函数番外篇
通常看到strrchr这个函数,人们很自然的想问库里面有没有strrstr这个函数呢??? 答案是:没有。 但是我们可以自己实现一个strrstr函数,它的功能是查找最后一次出现的子字符串,如果找打则返回这个地址,如果没找到则返回空地址。 实现方案:对于这个函数有两种实现方式。 第一种是从后向前找,第一次找到就返回这个地址。原创 2016-05-10 22:40:52 · 2504 阅读 · 0 评论 -
宏的用法与简介
预处理指令:例如:#include #include #define MAX 20 ............. 因为他们由预处理器解释的,所以称作预处理指令。预处理器读取源代码,然后对其修改,并把修改过的源代码传给编译器,再由编译器编译。在我们的例子中预处理器用库函数stdio.h , stdlib.h的内容替换分别执行第一,二条预处理指令(#原创 2016-03-13 23:58:55 · 725 阅读 · 0 评论 -
编译链接粗浅认识
一个后缀为“.c”文件(源文件),首先要被编译器编译生成目标文件(后缀为“.obj"),然后再通过链接转换为可执行文件(后缀为“.exe")才能运行。编译:编译器对源文件进行编译,把源文件中以“文本形式”存在的源代码翻译成机器语言(二进制)的形式,并生成目标文件(源代码全部变成"二进制"的形式)。在编译期间,编译器会对源代码中的语法进行检查,如果没有错误,则生成“.obj”文件,否则会原创 2016-03-16 17:35:48 · 557 阅读 · 0 评论 -
const在c中的用法
常量和变量的样子完全一样,只是常量的值不允许被修改。我们用const这个关键字来声明一个常量。例: const int a=10; int const a=10;两种方式都可以声明一个常量效果是一样的。我们也可以用const来修饰指针:const与标识符: 例: #define num 20原创 2016-03-16 20:23:33 · 569 阅读 · 0 评论 -
const在c中的用法
常量和变量的样子完全一样,只是常量的值不允许被修改。我们用const这个关键字来声明一个常量。例: const int a=10; int const a=10;两种方式都可以声明一个常量效果是一样的。我们也可以用const来修饰指针:const与标识符: 例: #define num 20原创 2016-03-16 21:30:11 · 540 阅读 · 0 评论 -
缓冲区概念
引言:我们先来看一个程序:intmain(){ charch1; charch2; scanf("%c", &ch1); ch2 = getchar(); system("pause");原创 2016-03-20 02:03:35 · 2363 阅读 · 0 评论 -
C语言32个关键字
常见关键字:int 声明整型变量double 声明双精度变量long 声明长整型变量char 声明字符型变量float 声明浮点型变量short 声明短整型变量signed原创 2016-03-20 02:06:09 · 582 阅读 · 0 评论 -
全局变量,局部变量和形式参数
全局变量:全局变量在整个程序内都是可知的,因此可以被任何代码段所使用,他们在程序中执行时保持他们的值,可以再任何函数之外来创建他们,任何表达式都可访问他们。全局变量存储在一个固定的存储区,这时由编译器设定的,当程序中多个函数使用一个变量时,全局变量就变得很有用。但是不必要的全局变量却会带来麻烦:1、全局变量在整个程序运行中都占据内存,只有当程序结束时才被销毁。2、在应该使用局部变量的地原创 2016-03-20 02:07:36 · 2064 阅读 · 0 评论 -
浮点数的比较
float 是单精度浮点类型 占4个字节double 是双精度浮点类型 占8个字节long double 规定long double 至少与double一样长 8个字节因为浮点类型不能精确的表示一个数,所以浮点数据类型不能与0值进行直接比较,所以我们在比较浮点数与0的大小关系时,通常要设置一个精度范围,只要浮点数在正负精度范围之内,我们就可以认为该浮点数大小为0.例:判原创 2016-03-20 02:08:57 · 769 阅读 · 1 评论 -
动态内存简介
为什么要使用动态内存?通常当我们声明一个数组时必须要指定他的长度,但是数组的长度只有在程序运行时才知道,这是因为他所需的内存空间取决于输入数据的类型。这种方法虽然简单,但是他的缺点却极大的限制了程序的灵活性和健壮性。这种方式收到了人为限制,一但我们输入的数据元素超过了数组长度,他就无法处理这种情况,所以通常我们价将数组长度设置的非常大。因为数组很大,但是如果我们输入的数据元素很少,这样就极大的原创 2016-03-12 21:08:57 · 661 阅读 · 0 评论 -
数组名与数组名取地址的差异
定义一个整形数组arr[10],其中arr、&arr在不同的情况下代表的地址是不同的。 一般情况下arr代表的是数组首元素的地址,而&arr代表的则是数组的地址。 虽然数组首元素地址与数组地址的内存地址相同,但是他们代表的含义却不同,所以对他们进行运算时,所得结果也不同。例如:在scanf()、printf()函数和形参中,arr代表的是数组首元素的地址。int main(原创 2016-05-11 12:52:04 · 482 阅读 · 0 评论 -
坑爹的不受限字符串函数
1、字符串长度函数原型:size_t strlen(char const *string);strlen()计算的长度不包括'\0'。strlen返回的值是一个无符号的整型,所以像if(strlen(x)-strlen(y)>=0)的结果是绝对为真的,将达不到你想要的结果。计算字符串长度的实现:#include#includeint my_strlen(ch原创 2016-05-11 12:50:54 · 1193 阅读 · 0 评论 -
宏的多种用法与简介
预处理指令:例如:#include #include #define MAX 20 ............. 因为他们由预处理器解释的,所以称作预处理指令。预处理器读取源代码,然后对其修改,并把修改过的源代码传给编译器,再由编译器编译。在我们的例子中预处理器用库函数stdio.h , stdlib.h的内容替换分别执行第一,二条预处理指原创 2016-05-11 12:35:03 · 613 阅读 · 0 评论 -
动态内存简介
为什么要使用动态内存? 通常当我们声明一个数组时必须要指定他的长度,但是数组的长度只有在程序运行时才知道,这是因为他所需的内存空间取决于输入数据的类型。这种方法虽然简单,但是他的缺点却极大的限制了程序的灵活性和健壮性。这种方式收到了人为限制,一但我们输入的数据元素超过了数组长度,他就无法处理这种情况,所以通常我们价将数组长度设置的非常大。因为数组很大,但是如果我们输入的数据元素很少,这原创 2016-05-11 12:38:43 · 629 阅读 · 0 评论 -
c语言题中的一些陷阱
1、求下列两个数组的长度关系characX[] = "abcdefg"; char acY[] ={ 'a', 'b','c', 'd', 'e', 'f', 'g' };解析:对于字符串来说,字符串结尾默认为‘\0’,所以acX[]的长度为8,而第二个数组的大小长度为7,而且因为没有用‘\0’结尾,所以在屏幕上输出的值是不确定的.2、求下列原创 2016-05-11 12:42:16 · 1036 阅读 · 0 评论 -
位段那些事
位段(以32位int整数的机器为例) 概念:C语言允许在一个结构体中以位为单位来指定成员所占内存的实际大小,这种以位为单位的成员我们称为位段,位段是一种特殊的结构体,位段的声明和任何普通的结构体成员声明类似,如下: St原创 2016-05-11 12:43:24 · 575 阅读 · 0 评论 -
指针的内容 ; 指针的地址 指针所指向的内容 指针的类型 指针所指向的类型
这几个个东东很具有迷惑性。int a=10; //假设a的地址是 0x0000004Cint *p; //假设p的地址是 0x0035FA94p=&a;指针的内容:指针里面存放的是地址。指针p里面存放的是a的地址(&a)。即指针p里面存放的内容是0x0000004C。指针的地址:指针本身的地址。指针p原创 2016-05-11 12:47:25 · 2928 阅读 · 0 评论 -
链接属性
原创 2016-05-11 12:48:22 · 375 阅读 · 0 评论