C语言编程
IT悟物穷理IT
作家格拉德威尔在《异类》一书中指出:“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件”。他将此称为“一万小时定律”。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。
展开
-
static的作用
static的作用 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; //转载 2016-06-27 09:15:02 · 211 阅读 · 0 评论 -
有关static的几个小程序
/*#includeint main(void){ static int a=1; //a定义为静态全局变量 int b=1,i=3; while(i--) { a++; b++; } printf("a:%d,b:%d\n",a,b); //结果;a为4,b也为4 return 0; }*/原创 2016-10-24 18:31:20 · 299 阅读 · 0 评论 -
C/C++基本数据类型所占字节数
关于这个基本的问题,很早以前就很清楚了,C标准中并没有具体给出规定那个基本类型应该是多少字节数,而且这个也与机器、OS、编译器有关,比如同样是在32bits的操作系统系,VC++的编译器下int类型为占4个字节;而tuborC下则是2个字节。所以int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的):siz转载 2016-10-24 19:49:24 · 196 阅读 · 0 评论 -
sizeof小程序
//************************sizeof小程序***********************************************************/*#includeint main(void){ int *p=NULL; int a[100]; printf("%d\n",sizeof(p));原创 2016-10-25 07:45:52 · 328 阅读 · 0 评论 -
strlen /sizeof/ 0,'\0','0'中的陷阱
#include#includemain(){ char x[]="STRING"; x[0]=0; x[1]='\0';x[2]='0'; printf("%d %d\n",sizeof(x),strlen(x)); } 结果为7,0 一旦char[]="STRING",这时候分配的内存7字节,之后无论怎么修改如何赋值都不会改变字符串是借助于字符原创 2016-09-03 21:13:57 · 7042 阅读 · 1 评论 -
C语言 unsigned 和 signed 类型相互转换深入理解
C语言 unsigned 和 signed 类型相互转换深入理解 转载请注明出处 http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html 转载请注明出处 http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html#inclu转载 2016-10-25 14:30:02 · 1117 阅读 · 0 评论 -
int与unsigned等转换深入理解(二)
1、隐式转换 C在以下四种情况下会进行隐式转换: 1、算术运算式中,低类型能够转换为高类型。 2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。 3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。 4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。转载 2016-10-25 14:50:55 · 15520 阅读 · 0 评论 -
字符数据在内存中的存储形式及其使用方法(C实现)
字符数据在内存中的存储形式及其使用方法(C实现)1、将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。 例如字符'a'的ASCII代码为97,'b'为98,在内存中变量c1、c2的值如下图(a)所示。实际上是以二进制形式存放的,如(b)所示。既然在内存中,字符数据以ASCII码存储,它的存储形式就与整数转载 2016-10-25 17:10:43 · 14905 阅读 · 3 评论 -
volatile和const放在一起
volatile可理解为“编译器警告指示字”volatile用于告诉编译器必须每次去内存中取变量值volatile主要修饰可能被多个线程访问的变量volatile也可以修饰可能被未知因数更改的变量const和volatile放在一起的意义在于:(1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;(转载 2016-10-26 18:19:15 · 506 阅读 · 0 评论 -
enumeration枚举变量的大小
在《C语言深度剖析》这本书中留有一个问题,枚举变量的大小是多少?1、大家猜一下下面这段程序红色部分输出的结果是多少?2、在printf(char *fmt.....)函数里,如需打印枚举变量里的某个域值如何表示枚举变量里面的成员? #include int main(){ enum Color { GREEN = 1,转载 2016-10-28 09:39:39 · 1253 阅读 · 0 评论 -
C语言注释可以出现在C代码任何地方吗?
int/*....*/i; //正确 char* s="abcdefgh //hijklmn"; //正确 in/*...*/ti; //错误注释会被空格替换 //注意:原创 2016-10-28 10:03:05 · 3584 阅读 · 0 评论 -
用define 宏定义注释符号?
#define BSC //#define BMC /*#define EMC */D),BSC my single-line commentE),BMC my multi-line comment EMCD)和E)都错误,为什么呢?因为注释先于预处理指令被处理,当这两行被展开成//…或/*…*/时,注释已处理完毕,此时再出现//…或/*…*/自然错误.因此,试图用宏开始或原创 2016-10-28 16:34:41 · 456 阅读 · 0 评论 -
c语言中-1除以2为什么等于0?
有符号整数的向右移位运算也并不等同于除以2的某次幂。(-1)>>1,这个操作结果一般不为0.但是(-1)/2在大多数C实现上求值结果都为0;转载:int型数据:-1=(1000,0001B)原=(1111,1110B)反=(1111,1111B)补=(FFH)补。补码在计算机中进行的运算不同于一般的二进制数运算。他有自己的一套规则。比如加减法:[X+Y]补=[X]补+[Y]补;[X转载 2016-11-21 14:58:06 · 8610 阅读 · 0 评论 -
ASSERT(0);
1.使用方法 在开发过程中我们可以假设只要程序运行正确,某一条件肯定成立。若不成立,那么我们可以断言程序肯定出错。在这种情况下我们可要利用ASSERT来设定断 言。ASSERT宏的参数是一个逻辑表达式,在程序运行过程中,若该逻辑表达式为真,则不会发生任何动作;若此表达式为假,则系统弹出一个对话框警告你, 并停止程序的执行。同时要求你作出选择:取消、忽略和重试。若你选择取消,则系统转载 2017-01-12 09:26:05 · 442 阅读 · 1 评论 -
计算机中栈区,堆区,静态存储区,文字常量存储区,代码区的详细解释
一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储转载 2016-10-21 20:37:23 · 328 阅读 · 0 评论 -
C
一、 想说一说关于集中数据类型的sizeof问题,这题出现率40%sizeof就是求在内存总占多少字节的问题,最基本的char 1字节 short 2字节 int 4字节任何的指针都是4字节 sizeof(数组名)=数组占的大小(这里必须注意虽然数组名可作为只想数组首地址的指针,但是sizeof(数组名)求得的不是指针的大小,而是数组大小)还有就是sizeof(结转载 2016-09-25 16:22:40 · 216 阅读 · 0 评论 -
union共用体详解
/*4.5.12.共用体union4.5.12.1、共用体类型的定义、变量定义和使用(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。(2)共用体和结构体的不同:结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有原创 2016-09-19 11:16:23 · 1055 阅读 · 0 评论 -
struct结构体
结构的定义定义一个结构的一般形式为:struct 结构名{成员表列}成员表由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明。例如:struct stu{int num;char name[20];int age;}结构类型变量的说明结构体定义并不是定义一个变量,而是定义了一种数据类型,这种类型是你定义的,转载 2016-06-27 19:04:57 · 367 阅读 · 0 评论 -
argc argv传参
main(int argc,char **argv) argv为指针的指针 argc为整数 char **argv or: char *argv[ ] or: char argv[ ][ ]main()括号内是固定的写法。下面给出一个例子来理解这两个参数的用法:假设程序的名称为prog,1.当只输入prog,则由操作系统传来的参数为:原创 2016-06-12 19:31:34 · 603 阅读 · 0 评论 -
用C语言实现大小端判断
摘自:http://blog.csdn.net/fei324/article/details/6887608大端小端的概念(以下概念来自网络)端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile End转载 2016-09-14 12:28:19 · 709 阅读 · 0 评论 -
字符串倒序输出(一道笔试题),2种方法,指针/malloc,strcpy
题目;将"I am a good boy"字符串倒序输出//将字符串倒序输出/*#include#include#includeint main(void){ int i; char *p; char buf[]={"I am a good boy"}; //p=(char *)malloc(sizeof(buf)); p=buf; for(i=原创 2016-09-03 18:39:09 · 2632 阅读 · 0 评论 -
斐波那契数列,获取第f1项(笔试为求第30项)
//斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144........ #includeint func(int f1) //运用递归来获得第f1项,0是第0项,不是第1项{ if(f1<=1) return f1; else return func(f1-1)+func(f1-2);}in原创 2016-09-03 20:33:47 · 2222 阅读 · 0 评论 -
typedef struct与struct
1 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是struct Student的别名。Stu==struct转载 2016-09-04 09:45:54 · 197 阅读 · 0 评论 -
#error命令
#error命令是C/C++语言的预处理命令之一,当预处理器预处理到#error命令时将停止编译并输出用户自定义的错误消息。#error [用户自定义的错误消息]注:上述语法成份中的方括号"[]"代表用户自定义的错误消息可以省略不写。举例1:#error Sorry,an error has occurred!举例2:#error用法示例原创 2016-09-16 17:40:23 · 342 阅读 · 0 评论 -
strcmp返回值布尔类型的判断(分析常见错误)
strcmp返回值布尔类型的判断strcmp: 用于比较两个字符串,原型如下:int strcmp ( char const *s1, char const *s2);如果s1小于s2,strcmp函数返回一个小于零的值。如果s1大于s2,函数返回一个大于零的值。如果两个字符串相等,函数就返回零。警告:初学者常常会编写下面这样的表达式 if转载 2016-09-04 17:44:37 · 907 阅读 · 0 评论 -
获取结构体字节数简单的方法
结构体计算要遵循字节对齐原则结构体默认的字节对齐一般满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填转载 2016-09-04 18:20:18 · 1324 阅读 · 0 评论 -
int和unsigned int的细节问题(重要细节)
[cpp] view plain copyint main() { int a = -6; unsigned int b = 4; if(a+b > 0) printf("a+b>0\n");//这句话被打印 else printf("a+b);转载 2016-09-04 20:05:58 · 533 阅读 · 0 评论 -
C语言的整型溢出问题(未看)
整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视。整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一个buffer overread的事件。在这里写下这篇文章,希望大家都了解一下整型溢出,编译器的行为,以及如何防范,以写出更安全的代码。什么是整型溢出C语言的整型问题相信大家并不陌生了转载 2016-09-17 08:37:15 · 255 阅读 · 0 评论 -
unsigned问题
1.unsigned int a=-3;printf("%u\n",~a);为什么打印出来的是2因为-3在计算机中是以补码存在的,只要把3的二进制取反在加1就是-3 的补码:FF FF FF FD然后取反当然是2了!2.#include int main(){unsigned int k=-5;printf("%u", k);ge原创 2016-09-05 08:29:46 · 336 阅读 · 0 评论 -
C语言数组名及指向数组指针的小结
C语言数组名及指向数组指针的小结2012-03-13 happy123g... 阅 2133 转 13转藏到我的图书馆微信分享:C语言的数组名和对数组名取地址转自: http://blog.csdn.net/zdcsky123/article/details/6517811相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址。现在有这转载 2016-09-05 09:06:11 · 952 阅读 · 0 评论 -
union/指针,测试大小端
//大小端测试程序:高位放在低地址为大端,高位放在高地址为小端//一般在c51中为大端,在ARM中为小端模式/*#includeunion myunion{ int a; char b;};int main(void){ union myunion c; c.a=1; printf("c.b=%d.\n",c.b);//如果c.b=1则为小端模式 pri原创 2016-09-19 11:00:09 · 472 阅读 · 0 评论 -
共用体里嵌套结构体的问题
#include typedef union{ unsigned int u; struct { unsigned char a :1; unsigned char b :1; unsigned char c :6; unsigned char d :1; } ST;}UN;转载 2017-02-27 09:04:24 · 6873 阅读 · 0 评论