C
microlyc
这个作者很懒,什么都没留下…
展开
-
有符号与无符号 整形变量 相加和比较
int main() { unsigned int a = 1; int b = -20; std::cout 6) ? ">6" : "<6"); return 0;}输出 >6因为:int 转为unsigned intint main() { unsigned int a = 1; int b = -1; std::cout 1) ? ">1"原创 2017-09-27 09:09:35 · 1382 阅读 · 0 评论 -
C语言的左移和右移
左移:当左移的位数不超过该数值类型的最大位数时:逻辑左移(补0,丢弃最高位)当左移的位数超过该数值类型的最大位数时:编译器会用左移的位数去模类型的最大位数,然后按余数进行移位(只是执行:左移 所得的余数 个位数)int i = 1, j = 0x80000000; //设int为32位i = i << 33; // 33 % 32 = 1 只左移1位,i变成2j =原创 2017-10-17 16:18:45 · 2080 阅读 · 0 评论 -
两数交换三种方法:指针,加减法与位运算
http://www.nowamagic.net/academy/detail/40110208void swap(int *x, int *y){ int t; t=*x; *x=*y; *y=t;}如果再加个限制,不使用额外的变量,可以这样:void swap(int *x,int *y){ *x = *x + *y;转载 2017-10-24 19:30:06 · 338 阅读 · 0 评论 -
头文件中ifndef/define/endif的作用
例如:要编写头文件test.h #ifndef _TEST_H #define _TEST_H//一般是文件名的大写 ············ #endif 1.比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成转载 2017-10-25 08:50:12 · 846 阅读 · 0 评论 -
浅谈从源代码文件到二进制可执行文件的过程
=== .c ===预处理 -》.c (源文件)编译 -》.s/asm (汇编程序)汇编 -》.o/obj 目标程序(二进制文件)链接 -》.exe可执行程序 (二进制文件)(1) 为什么要生成汇编,而不是直接从源文件编译成机器指令(二进制代码)?首先,汇编语言作为机器指令的助记符,调试以及优化起来都会比较方便;其次,汇编到机器指令的过程转载 2017-10-25 08:55:38 · 1052 阅读 · 0 评论 -
C++中define与const的区别
区别如下:用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;用const float MAX = 255; 定义的常量有类型名字,存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝,转载 2017-10-25 08:59:51 · 203 阅读 · 0 评论 -
内存泄漏,动态内存无作用域问题,如何避免内存泄漏
无论是C还是C++程序,运行时候的变量主要有三种分配方式:堆分配、栈分配、全局和静态内存分配。内存泄漏主要是发生在堆内存分配方式中,即“配置了内存后,所有指向该内存的指针都遗失了”,若缺乏语言这样的垃圾回收机制,这样的内存片就无法归还系统。因为内存泄漏属于程序运行中的问题,无法通过编译识别,所以只能在程序运行过程中来判别和诊断。 百度百科:内存泄漏(Memory转载 2017-10-24 11:26:53 · 774 阅读 · 0 评论 -
strcpy和memcpy的区别
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它还会复制字符串的结束符。已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。void *memcpy( void *dest, const void *s翻译 2017-09-27 07:57:50 · 213 阅读 · 0 评论 -
函数返回局部变量的几种情况
转载 http://blog.csdn.net/haiwil/article/details/6691854/本文主要详细讨论了返回返回局部变量的几种情况,值得大家注意。 准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明:1:转载 2017-10-25 12:15:52 · 321 阅读 · 0 评论 -
函数指针数组
原创 2017-10-17 15:09:37 · 193 阅读 · 0 评论 -
C语言volatile关键字
volatile 是易变的、不稳定的意思。很多人根本就没见过这个关键字,不知道它的存在。也有很多程序员知道它的存在,但从来没用过它。我对它有种“杨家有女初长成,养在深闺人未识” 的感觉。volatile 关键字和const 一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进转载 2017-10-09 11:54:48 · 5565 阅读 · 0 评论 -
typedef char (*PTRFUN)(int)
typedef char (*PTRFUN)(int); PTRFUN pFun; char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); } typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指转载 2017-10-16 10:22:57 · 617 阅读 · 0 评论 -
源代码文件到二进制可执行文件的过程
=== .c ===预处理 -》.c (源文件)编译 -》.s/asm (汇编程序)汇编 -》.o/obj目标程序(二进制文件)链接 -》.exe可执行程序 (二进制文件)(1) 为什么要生成汇编,而不是直接从源文件编译成机器指令(二进制代码)?首先,汇编语言作为机器指令的助记符,调试以及优化起来都会比较方便;其次,汇编到机器指令的过转载 2017-10-09 11:21:10 · 6440 阅读 · 0 评论 -
memcpy和memmove()
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当转载 2017-09-27 09:25:59 · 236 阅读 · 0 评论 -
c语言 continue
在for循环中用break或continue跳出循环后 还执行增量表达式吗?break跳出循环,不再执行循环内的任何语句continue执行下一次循环,执行for里面的增量表达式continue不会跳过do while的条件判断(http://blog.csdn.net/you_lan_hai/article/details/50993768)int i = 0;do{转载 2017-10-17 16:37:42 · 1134 阅读 · 0 评论 -
内联函数和宏定义的区别
使用宏和内联函数都可以节省在函数调用方面所带来的时间开销。二者都采用了空间换时间的方式,在其调用处进行展开:(1) 在预编译时期,宏定义在调用处执行字符串的原样替换。在编译时期,内联函数在调用处展开,同时进行参数类型检查(而 宏 不检查)。(2) 内联函数首先是函数,可以像调用普通函数一样调用内联函数。而宏定义往往需要添加很多括号防止歧义,编写更加复杂。(3转载 2017-10-24 15:00:31 · 187 阅读 · 0 评论 -
new与malloc
再谈二者区别:1、new自动计算需要分配的空间,而malloc需要手工计算字节数2、new是类型安全的,而malloc不是,比如:int* p = new float[2]; // 编译时指出错误int* p = malloc(2*sizeof(float)); // 编译时无法指出错误new operator 由两步构成,分别是 operator new 和 c原创 2017-09-27 09:54:46 · 293 阅读 · 0 评论 -
strcpy函数的实现
已知strcpy函数的原型是:char *strcpy(char *dst, const char *src);实现strcpy函数解释为什么要返回char *假如考虑dst和src内存重叠的情况,strcpy该怎么实现char * strcpy(char *dst,const char *src) //[1]{ assert(dst != NULL && src转载 2017-09-27 08:28:36 · 222 阅读 · 0 评论 -
声明一个函数,参数是一个char,返回值是指向一个int参数一个int返回值的函数指针
int (*f(void))(int);//f是此函数名,此函数没有参数,返回指向一个函数的指针;这个被指向的函数有一个int型形参,且返回一个int值int (*f(char))(int);//f是此函数名,此函数参数是一个char,返回指向一个函数的指针;这个被指向的函数有一个int型形参,且返回一个int值#include int fun(int n原创 2017-10-11 08:36:00 · 3474 阅读 · 0 评论 -
关于#include<**.h>和#include"**.h"的区别
当用#include“file.h”时,先搜索当前工作目录,如果没有,再去搜索库,库没有再搜索资源库;当用#include<file.h>时,编译器先从标准库路径开始搜索,如果没再搜索资源库目录,最好搜索当前工作目录。...转载 2017-10-11 08:23:41 · 3049 阅读 · 0 评论 -
结构体在内存中的对齐规则
一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一: #include using namespace std;转载 2017-10-09 11:40:53 · 175 阅读 · 0 评论 -
局部变量、全局变量和静态变量的含义和区别
(1)局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量. 1.主函数main中定义的变量也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效. 2.不同函数中可以使用名字相同的变量,它们代表不同的对象,互不干扰. 3.形式参数也使局部变量转载 2017-10-09 11:09:41 · 911 阅读 · 0 评论 -
指针类型:指向3行4列的整形二维数组
int a[3][4], *p, i; p = &a[0][0]; for (i = 0; i < 12; i++) { p[i] =i; } int (*pnum)[3][4]=&a;//赋a的地址 printf("%d\n", (*pnum)[1][3]);//要加*,要加括号,原创 2017-10-17 15:37:52 · 2617 阅读 · 0 评论