c语言
wtz的代码人生
这个作者很懒,什么都没留下…
展开
-
C语言中引用及指针和引用的联系与区别
引用:引用是一个变量的另一个名字,又称别名。定义方式: int a=10; int &b=a;在这里,意思就是给a变量起了一个新名字b,因此b不可再次被重新定义。 引用必须初始化,无空引用,并且引用不分等级。 引用与指针的异同点: 相同点:在引用中 int &b=a;这一句代码可被编译器看做int * const b=&a;//加上const的作用是表明指针b的自身的值(a的地址)不能改变原创 2017-10-28 16:51:53 · 22866 阅读 · 6 评论 -
指令与寄存器
EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元ESI、EDI、ESP、EBP:為si,di,sp,bp的延伸,32位元eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。比方说:add eax,-2 ; //可以认为是给变量eax加上-2这样的一个值。这些转载 2017-09-21 10:29:42 · 1128 阅读 · 1 评论 -
#define与#undef
#define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者 数字。 #undef ,就是取消一个宏的定义,之后这个宏所定义的就无效;但是可以重新使用#define 进行定义。 1.在一个程序块中用完宏定义后,为防止后面标识符冲突需要取原创 2017-10-15 22:41:43 · 2671 阅读 · 0 评论 -
九九乘法表及杨辉三角C语言实现
九九乘法表:void main(){int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j);}printf("\n");}}杨辉三角:void main(){int a[10][10];int i,j;for(i=0;i<10;i++){ a[i][0]=1; a原创 2017-10-16 21:03:59 · 483 阅读 · 0 评论 -
static关键字在c语言中的应用
static关键字在c语言中主要有两个作用。一、修饰变量。变量又分为局部变量和全局变量,但他们都在内存的静态区,静态变量只能被初始化一次。 静态全局变量,作用域仅限于被定义的文件中,其他文件即使用extern声明也没法使用它。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加extern。。 静态局部变量,在函数体内原创 2017-11-20 21:26:16 · 332 阅读 · 0 评论 -
switch和if else的效问题
详细描述switch与ifelse的区别。 switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。具体地说,switch.翻译 2017-12-12 22:15:05 · 228 阅读 · 0 评论 -
常见字符串函数的实现
strlen(),strcpy()int my_strlen(const char *str)//字符串长度{ assert(str != NULL); int len = 0; while (*str ++ != '\0') { ++ len; } return len; }char *my_strcpy原创 2017-12-24 20:52:35 · 4726 阅读 · 0 评论 -
程序编译过程
在运行一个程序时,事实上经过了预编译,编译,汇编,链接四个过程。只不过我们在运行程序时,这些步骤被隐藏了。①预编译:把源代码文件如main.c,被预编译成一个.i文件。在linux下的命令为:gcc-E main.c -o main.i预编译的具体任务:1.将所有的“#define”删除,并展开所有的宏定义。2.处理所有条件预编译指令。3.处理头文件预编译指令,将被包含原创 2017-12-07 21:17:41 · 308 阅读 · 1 评论 -
const和define的区别
①编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。②类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。③存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。 const常量会在内原创 2017-12-25 21:45:03 · 157 阅读 · 0 评论 -
选择排序,冒泡排序,直接插入排序,shell排序
一、选择排序: 时间复杂度:无序O(n^2) 有序O(n) 空间复杂度:O(1) 算法稳定性:不稳定(相同数值都交换了) 原理:选择一个值arr[0]作为标杆,然后循环找到除这个值外最小的值(查找小于标杆的最小值), 交换这两个值,这时最小值就被放到了arr[0]上,然后再将arr[1]作为标杆,从剩下未排序的值中找到最小值, 并交换这两个值。 例:4 1 5 12 0 第一趟:1...原创 2018-06-12 15:53:18 · 248 阅读 · 0 评论 -
指令系统的寻址方式大致汇总
指令寻址:1.顺序寻址:通过程序计数器pc加1,自动形成下一条指令的地址。2.跳跃寻址:通过转移类指令直接或间接给出下一条指令的地址。数据寻址:1.隐含寻址:操作数地址不明显的给出,隐藏在指令中。2.立即寻址:给出的不是操作数的地址,而是操作数的本身。3.直接寻址:直接给出操作数的真实地址。4.间接寻址:给出操作数有效地址所在的存储单元的地址。5.寄存器寻址:直接给原创 2017-09-27 20:14:08 · 3453 阅读 · 0 评论 -
#define、const、enum的用法及区别
define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者数字。①被定义为“宏”的标识符称为“宏名”。在编译处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替代,这称为“宏代替”。宏定义是由源程序中的宏定义命令完成的。宏代替是由翻译 2017-09-27 16:38:38 · 795 阅读 · 0 评论 -
数组的使用及与指针的联系
数组,顾名思义就是一组数据的集合即一批具有同名的同属性的数据就组成一个数组。由此可知,①数组是一组有序数据的集合。②用一个数组名和下标来表示确定数组中的元素。③数组中的每一个元素都属于同一个数据类型。 数组的定义: 例:int a[10] 表示数组名为a,数组长度有10个整形元素。 类型符 数组名[常量表达式]原创 2017-10-20 22:33:49 · 407 阅读 · 0 评论 -
可见性与生存期
1.可见性=>编译器2.生存期=>执行时若定义一全局变量,则该变量可贯穿整个程序,在任何地方都可以被编译识别。若又定义一个 局部变量与全局变量重名时,则变量取值采取就近原则,即局部变量,倘若非要全局变量,则在变量前必须加上::表示全局变量。块区域在局部中,快中定义的变量只能在块中使用,出块则不能使用,得重新定义。若块中变量与局部变量名冲突,则也遵循就近原则,但在这里若原创 2017-10-14 12:53:02 · 278 阅读 · 0 评论 -
C语言中定义和声明的一些差别
定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。 变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 声明:告诉编译原创 2017-10-15 22:20:27 · 619 阅读 · 0 评论 -
跳出语句:go to,break,return,continue的差别
go to:goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒h号(:)。语句标号起标识语句的作用,与goto 语句配合使用。goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。bre原创 2017-10-14 12:21:34 · 6820 阅读 · 0 评论 -
inline关键字
一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用转载 2017-10-11 21:25:49 · 190 阅读 · 0 评论 -
char ch[100]; char *str; gets(ch); gets(str);
char ch[100]; char *str; gets(ch);//输出小于数组长度内部的字符的值 gets(str);//str首先要分配空间,将指针p分配一组字符串内存地址,指针的作用是保存一个内存地址。将指针str分配一组字符串内存地址如下str = (char *)malloc(NUM*sizeof(char)); gets()函数:从流中读取字符串。翻译 2017-09-29 21:11:35 · 2672 阅读 · 0 评论 -
char ch[10]={"yhping"}; char ch2[10]={'y','h','p','i','n','g'}; char *str = "yhping"; 区别是什么。
char ch[10]={"yhping"};//字符串数组,用字符串常量进行初始化 不能改变大小或重分配 但可改变内容。在栈上申请空间,将常量内容复制进来,所以是局部变量。它等价于char ch[10]={'y','h','p','i','n','g','\0'};系统自动在后面加了一个'\0',作为字符串结束的标志,后3个元素为空字符。char ch2[10]={'y','h','p','翻译 2017-09-29 20:34:25 · 1297 阅读 · 0 评论 -
#define PINT int*与typedef int *SINT的区别.
#define PINT int* #define是预处理指令,简单的宏定义,在编译预处理时进行简单的替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。①#define PINT int*是,在预处理阶段就已经将PINT替换为int*了,它与int *不等价②如果有PINT a,b; //实际就是 int* a,b;翻译 2017-09-29 19:16:16 · 595 阅读 · 0 评论 -
printf()函数
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序时经常会用到此函数。函数的原型为: int printf(const char *format, ...); 函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。 printf()函数的调用格式为: printf("", );//这里看输出很简单,前翻译 2017-09-27 20:31:31 · 229 阅读 · 0 评论 -
Nginx内存池的一些理解
内存管理中为避免内存碎片,nginx管理内存技术在此理解:结构图如下:一、内存池的数据结构在nginx内存池中有一个头部,头部里又包含一个数据部,数据部主要用来为用户分配小块内存。数据部之外主要为用户分配大块内存、管理外部资源、日志信息以及内存池的一些其他信息。ngx_pool_s的ngx_pool_data_t中:last:是一个unsigned char 类型的指针,保存的是/当前...原创 2018-10-22 20:32:16 · 1190 阅读 · 0 评论