
C 基础
文章平均质量分 62
把大学没学完的学完
用代码淋漓尽致的展现自己的思路
展开
-
位操作的基础
位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算).位运算符取反(NOT)取反是一元运算符, 对一个二进制数的每一位执行逻辑反操作. 使数字1成为0, 0成为1. 例如: NOT原创 2014-03-13 13:21:29 · 378 阅读 · 0 评论 -
C语言中变量作用域问题
示例代码一:#include int main(){ int score = 100; { int score = 200; { score = 50; } printf("score=%d\n", score); } printf("score=%d\n", score); return 0;}输出结果:sc原创 2014-03-25 00:47:12 · 549 阅读 · 0 评论 -
C语言中函数参数的传递的三种形式
C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。下面用这三种方式来实现两个变量值的对调。代码一为值传递,代码二为地址传递,代码三为引用传递。 示例代码一(该方法并不能实现两个变量值的对调): void Exchg1(int x, int y) { int temp; temp = x; x = y; y = temp; printf("x = %原创 2014-03-24 23:59:13 · 1670 阅读 · 0 评论 -
最近在使用sprintf构造字符串时遇到的一个问题
直接上代码:#include #include int main(){ char szTmp[20] = {0}; char szDst[20] = {0}; int i; memset(szTmp, 'a', sizeof(szTmp)-1); sprintf(szTmp, "%d", 2);原创 2014-04-08 00:03:53 · 1341 阅读 · 0 评论 -
srand函数
srand函数是随机数发生器的初始化函数。 原型:void srand(unsigned seed);用法:srand和rand()配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。srand(unsigned seed)通过原创 2014-03-27 00:56:58 · 790 阅读 · 0 评论 -
得到数组的最后一个数的趣味实现
利用指向数组的指针存放的值与指向数组首元素的指针存放的值是相等的,即数组的首地址就是数组首元素的首地址,但是这个数组变量的值等于数组首元素的首地址,为什么数组变量的值要等于数组首元素的地址,目的是方便提取数组元素的数据。(a[i]=*(a+i))#include using namespace std;int main(){ cout<<"得到数组最后一个数的趣味实现方案一原创 2014-03-26 12:06:13 · 488 阅读 · 0 评论 -
用C读取INI配置文件
在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux平台上就一筹莫展了。为了解决该问题,打算用C来读取.ini,即可不受平台的限制了。原创 2014-04-07 22:21:13 · 392 阅读 · 0 评论 -
va_list,va_start,va_end,等的说明
库里的头文件:#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )#define va_arg(ap,t) ( *(t *)((ap += _INTSI原创 2014-04-07 20:37:53 · 384 阅读 · 0 评论 -
__cdecl与__stdcall
__cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 __stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入原创 2014-04-07 20:39:41 · 370 阅读 · 0 评论 -
如何理解signal函数声明
Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解。自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下。 先看函数原型:void (*signal(int signo, void (*func)(int)))(int);对于看惯了类似unsigned int sleep(unsigned int seconds);这种声明的人们来说,sign原创 2014-04-08 00:07:43 · 663 阅读 · 0 评论 -
C语言三种方法实现两个变量值的交换
一、利用一个临时变量来实现两个变量值的交换:#include int main(){ int a = 10; int b = 11; int temp; temp = a; a = b; b = temp; printf("a=%d,b=%d\n", a, b); return 0;}二、不用临时变量来实现两个变量值的交换原创 2014-03-25 00:28:09 · 6184 阅读 · 0 评论 -
数组的概念
所谓数组,就是相同数据类型的元素按一定顺序排列的集合。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。数组中的数据在内存里是连续的。 一维数组:int a[3]; a代表的是一个数组,但a的值是数组首元素的首地址。二维数组:int a[3][3];可以理解成由a[0],a[1],a[2]构原创 2014-03-23 19:06:33 · 608 阅读 · 0 评论 -
运算符优先级
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员名->原创 2014-03-13 22:38:12 · 337 阅读 · 0 评论 -
浮点数表示法中存在误差
先看下面的代码:#include using namespace std;int main(){ double a=0.65f,b=0.6f; double c=a-b; if(c==0.05) cout<<"对了"<<endl; else cout<<"错了"<<endl; return 0;}输出结果是:错了我们可以原创 2014-03-13 22:30:28 · 548 阅读 · 0 评论 -
I/O输入的几个操作的机制分析
1.getch调用getch,只允许用户输入一个字符后立即返回用户输入的字符,且用户输入的字符不会显示在控制台的屏幕上(不带回显)。2.getchegetche与getch功能很相似,只不过getche带回显。对于getch和getche都能读取空格符和换行符,只不过读取换行符时还转换为'\r'.调用getche,只允许用户输入一个字符后立即返回用户输入的字符,且用户输入的字符会显原创 2014-03-16 12:40:04 · 389 阅读 · 0 评论 -
C/C++变量在内存中的分布
C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象。先写一个测试程序:#include #include int g_i = 100;int g_j = 200;int g_k, g_h;int main(){ const int MAXN = 100; int *p = (int*)malloc(MAXN原创 2014-03-27 01:15:19 · 359 阅读 · 0 评论 -
C语言传递数组给函数的方式
1.传递一维数组 int a[10] 给函数,会隐式转换成指向数组首元素的指针,实质上传递的是指向数组首元素的指针(存放的值是数组首元素的地址,指向的数据是数组首元素)。在使用a值时,可以把a看成是一个指向首元素的指针。但是如果使用a的地址,一定要把a看成是一个数组整体。(其实数组变量a代表的是一个数组,但它的值是数组首元素的地址,有別于一般的变量)//打印一维数组a[n]void P原创 2014-03-29 15:46:43 · 5052 阅读 · 1 评论 -
int整数除以int整数一定得到的是int整数(易忽视)
int整数除以int整数一定得到的是int整数用int表示的一个整数除以用int表示的一个整数得到的一定是用int表示的整数用double表示的一个整数除以用int表示的一个整数得到的才可能是小数,或者是,用int表示的一个整数除以用double表示的一个整数得到的才可能是小数,或者是用double表示的一个整数除以用double表示的一个整数得到的才可能是小数。 原理就是原创 2014-03-29 13:01:33 · 14009 阅读 · 0 评论 -
C库中的qsort函数的问题分析
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *)); 这个算法有如下几个问题:1. 类型安全性:使用者必须自行保证base指向的数组的元素类型和compar的两个参数的类型是一致的;使用者必须自行保证size必须是数组元素类型的大小。2.原创 2014-03-30 21:15:48 · 703 阅读 · 0 评论 -
位运算详解(原码<-->反码<-->补码)
位运算就是对整数补码的各位上进行变换运算。计算机对数的运算都是针对补码的,计算完后再得出原码。*这里暂且视int类型为4字节,即32位。原码: 二进制数,如:7->0000000 0000000 00000000 00000111 -9->1000000 0000000 00000000 00001001反码:转载 2014-04-01 01:30:46 · 756 阅读 · 0 评论 -
volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外原创 2014-03-14 00:24:44 · 353 阅读 · 0 评论 -
LOWORD, HIWORD, LOBYTE, HIBYTE
LOWORD()得到一个32bit数的低16bit HIWORD()得到一个32bit数的高16bitLOBYTE()得到一个16bit数最低(最右边)那个字节HIBYTE()得到一个16bit数最高(最左边)那个字节原创 2014-04-09 15:17:36 · 716 阅读 · 0 评论