C 语言总结
_charles_
永不止步
展开
-
函数传递不定参数理解-c语言
感性认识Typedef char *va_list;/*这个在中有定义*/#define va_start(ap,p) (ap=(char*)(&(p)+1))#define va_arg(ap,type) ((type*)(ap+=sizeof(type)))[-1]#defien va_end(ap)/*下面为测试函数*/#include#include#includev原创 2013-11-17 16:57:01 · 2328 阅读 · 0 评论 -
结构体位制 中存在 有符号 与 无符号 -- C
#include <stdio.h>#include <stdlib.h>#include <string.h>/* 有符号 结构体1*/struct bits{ int b1:5; /* 因为是int型,最大设置32位,由于int型是有符号整形, 所以这里5位为有符号类型。 11111 -1 10000 -16 01111 15 00000 0 */ int :2; int b2:2; /* 11 -1 10 -2 01 1 0原创 2014-08-05 09:52:46 · 1109 阅读 · 0 评论 -
int a[3];中a+1与&a+1区别 -- C
int a[3];a 和 &a 的地址一样的。a+1 == a + 1*sizeof(int);跳跃是一个数组元素大小&a+1 == a + 3*sizeof(int);跳跃是整个数组大小#include <stdio.h>intmain(){ char * a[] = {"hello","the","world"}; char ** pa = a; pa ++; /* 获取数组中第二个元素 */ printf("*pa = %s\n",*pa); printf("*(a+原创 2014-07-30 10:03:02 · 1936 阅读 · 0 评论 -
ASCII表 基本记忆 -- C
/* ASCII表规则记忆 我们只要记住了一个字母或数字的 ASCII 码 (例如记住 A 为 65 , 0 的 ASCII 码为 48 ), 知道相应的大小写字母之间差 32。 0 -- 32 按键 33 -- 47 other字符 48(0x30) -- 57 0到9字符 58 -- 64 other字符 65(0x41) -- 90 A到Z字符 91 -- 96 other字符 97(0x61) -- 122 a到z字符 123 -- 127 other字符原创 2014-08-05 10:23:50 · 3973 阅读 · 0 评论 -
float与double在内存中 -- C
C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,转载 2014-07-31 09:22:19 · 882 阅读 · 0 评论 -
int类型有符号与无符号内存中 -- C
/*int 有符号 0xffffffff == -1 0xfffffffe == -2 最小 0x80000000 == -21 4748 3648 最大 0x7fffffff == 21 4748 3647 0x00000001 == 1 0x00000000 == 0 int 无符号 最大 0xffffffff == 42 9496 7295 0x80000000 == 21 4748 3648 0x7fffffff == 21 4748 36原创 2014-07-31 09:28:26 · 2259 阅读 · 0 评论 -
寄存器中 置位 与 清除 -- C
第3位的置位与清除操作。#include <stdio.h>#include <stdlib.h>#include <string.h>#define BIT3 (0x1<<3)intmain(){ int a = 0x00000000; printf("a = 0x%08X\n", a); /* 置位第3bit a = a | (0x1<<3) a = a | 0x8 */ a |= BIT3; printf("a = 0x%08X\n", a); /*原创 2014-07-31 14:03:27 · 4723 阅读 · 0 评论 -
关键字auto 含义 -- C
形如:auto int a=32;中的auto在编程中很少见,其几天笔试考到,由于不记得以前用过,就以无视auto的存在进行了处理。作用:C语言是面向过程的,会有很多分模块的函数,每个函数都会有其生存周期(也叫作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量,也就是说,如果在形如:int fun(){ int a=10; return a;转载 2014-08-05 11:19:33 · 1022 阅读 · 0 评论 -
结构体位制详解 -- C
#include <stdio.h>#include <stdlib.h>#include <string.h>//基本概念/*struct _M{ (1) 类型 参数名 : 占位大小; (2) 类型 : 占位大小;}(1) 类型 -- int,unsigned(32位),short,char。 参数名 -- 同个结构体里面不能重名参数。 占位大小 -- 不能大于类型最最大位数。 (2) 一般用于寄存器中保留位*///占位大小问题:/*err -- int类型是3原创 2014-07-31 11:11:58 · 2809 阅读 · 0 评论 -
堆和栈的区别 -- C
堆和栈的区别1.申请后系统的响应栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆。 结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空转载 2014-08-07 13:42:54 · 727 阅读 · 0 评论 -
函数压栈顺序 -- C
#include <stdio.h>#include <stdlib.h>#include <string.h>/* 压栈顺序 从右到左,从上到下压*/int fun(int i, char * s){ /* 编译器中等同于 int a; int b; */ int a,d; printf("&s = 0x%08x\n", &s); printf("&i = 0x%08x\n", &i); printf("&f = 0x%08x\n", &fun); print原创 2014-08-06 15:20:28 · 1963 阅读 · 0 评论 -
13 * 16 = 244 解这些数是什么进制数 -- C
/* 13 * 16 = 244 设为x进制数 解: (1*x + 3) * (1*x + 3) = 2*x^2 + 4*x +4 x^2 + 9x + 18 = 2x^2 + 4x + 4 x^2 - 5x - 14 = 0 (x - 7)(x - 2) = 0 解得: x = 7 或者 x = 2 接下来不用说了。。*/原创 2014-07-31 13:19:21 · 1859 阅读 · 0 评论 -
int main() { int *pa=NULL; int *pb=pa+15; printf("%x",pb); return 0; } -- C
这题是考指针偏移量,打印的是偏移后的地址。从0地址开始偏移,由于是int * 类型原创 2014-07-31 14:21:48 · 1563 阅读 · 0 评论 -
c语言编程规范
C语言变量名命名规则一、程序风格: 1、严格采用阶梯层次组织程序代码: 各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。 要求相匹配的大括号在同一列,对继行则要求再缩进4格。例如: 2、提示信息字符串的位置 在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临转载 2013-07-24 13:57:31 · 1277 阅读 · 0 评论 -
sizeof - 指针,数组,变量,结构体字节对齐-计算
#include struct{ short a1; short a2; short a3;}A;struct{ long a1; short a2;}B;int main(){ char * ss1="0123456789"; char ss2[]="01234567原创 2014-02-17 15:28:07 · 1464 阅读 · 0 评论 -
(int&)a和(int)a的区别 - c语言
[cpp] view plaincopy#include #include #include using namespace std; int main() { float a = 1.0f; cout int)a cout int&)a cout int)a == (int&)转载 2014-02-14 15:59:38 · 1498 阅读 · 1 评论 -
printf("%d,%d\n",*p1,*(++p1));
char a[]={6,7,8,9,10}; char * p = a; char * p1 = a; *(p++) += 123;//*(p++) = *p + 123 printf("%d\n",*p); printf("%d\n",*(++p)); *(p1++) += 123;原创 2014-02-17 11:21:48 · 2185 阅读 · 0 评论 -
#define FIND(struc,e) (size_t)&(((struc*)0)->e)
#include typedef struct TagTest{ int a; char b[20]; double ccc;}test;#define FIND(struc,e) (size_t)&(((struc*)0)->e)int main(){ printf("%d\n",FIND(test,a));原创 2014-02-17 11:19:39 · 1154 阅读 · 0 评论 -
const指针,指向const的指针,指向const的const指针 -- C
intmain(){ //记忆方法:中间加个"是"字变得很好理解 /* 指针函数 */ void * f(); //按顺序写,先写指针(void *),再写函数(f()) //指针是函数 -- 这个指针是一个函数。 /* 函数指针 */ void (* f)(); //函数是指针 -- 这个函数是一个指针。 //暂时没想到怎么记忆。 /* const 指针 */ const int * a; /* 指向 const 的指针 -- 指针 const*/ int *原创 2014-07-29 16:20:10 · 908 阅读 · 0 评论 -
a[2]地址-a[0]地址 实际等于 (a[2]地址-a[0]地址)/a的类型 -- C
#include <stdio.h>intmain(){ int a[3] = {0x1,0x2,0x3}; int *p, *q; printf("a[0] = 0x%X\n", a[0]); printf("a[1] = 0x%X\n", a[1]); printf("a[2] = 0x%X\n\n", a[2]); printf("&a[0] = 0x%X\n", &a[0]); printf("&a[1] = 0x%X\n", &a[1]); printf("&a[原创 2014-07-29 14:54:36 · 1176 阅读 · 0 评论 -
栈/入栈/出栈顺序(c语言)-linux
说明: 1、栈底为高地址,栈顶为低地址。2、入栈顺序:从右到左。原创 2013-11-17 16:54:41 · 3835 阅读 · 0 评论 -
a+=1/a=+1/a-=1区别-c语言
1、解释 a+=1/a=+1/a-=1 含义a+=1 实质等于 a += 1,也就是等于 a = a + 1;a=+1实质等于 a = +1;[因为运算符中没有=+,很多人误以为是 a =+ 1(错误)]a-=1实质等于 a -= 1;也就是等于 a = a - 1;2、与 a++ / ++a 区别a += 1 又等于 ++a -> a = a + 1;a -= 1 又等于 --a -> a = a - 1;[为什么不是等于 a++ 呢? 因为 a++ 是先进行复制再累加,而他们是原创 2013-11-17 16:56:39 · 11060 阅读 · 0 评论 -
回调函数实现例子-c语言
#include// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)typedef int (*CallBackFun)(char *p); // 为回调函数命名,类型命名为 CallBackFun,参数为char *pint Afun(char *p) { // 方法 Afun,格式符合 CallBackFun 的格式,因此可以看作是一转载 2013-11-27 10:50:35 · 1550 阅读 · 0 评论 -
全局变量和局部变量的区别-c语言
1.变量分类1.1 变量可以分为:全局变量、静态全局变量、静态局部变量和局部量。 1.2 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 1.3 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函转载 2013-12-12 20:50:56 · 1726 阅读 · 1 评论 -
## __VA_ARGS__ 宏
在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: 12#define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg)用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参转载 2014-02-12 17:02:06 · 875 阅读 · 0 评论 -
函数指针与指针函数区分-c语言
1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y);首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。表示:float *fu转载 2014-03-01 13:53:16 · 889 阅读 · 0 评论 -
switch中case...用法-c语言
... 表示范围case 0...4; // errorcase 5 ... 9; // okeg 1: char ch = 4; switch(ch) { case 1: printf(" into 1\n");break; case 3 ... 8: printf( " into 2 to 8\n");break; } out: into 2 to 8eg 2: switch(c) { case 'a' ... 'z': 操作原创 2014-03-01 13:58:16 · 5527 阅读 · 0 评论 -
什么是指针数组与数组指针? - c语言
什么是指针数组与数组指针?书写方法如下:实质就是优先级问题,[]的优先级比*高;指针数组:char (* p)[];数组指针:char * p[];例如:指针数组指针:char * (* p)[];数组指针数组:char (* p[])[];含义如下:指针数组:一个指针指向一个数组;数组指针:一个数组里都是指针;指原创 2014-03-01 13:48:24 · 1055 阅读 · 0 评论 -
bzero, memset 区别-c语言
bzero 原型:extern void bzero(void *s, int n);用法:#include 功能:置字节字符串s的前n个字节为零。 说明:bzero无返回值。 举例: // bzero.c #include #include int main()转载 2014-03-10 10:53:41 · 2365 阅读 · 0 评论 -
a+++++b 运算逻辑
int a=1,b=1; int c=a+++++b; printf("c=%d/n",c); 这段代码是无法通过编译的。解释如下: 1、首先介绍一些基本的概念 1)、大嘴法,又称贪心法: 如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符起之后可能组成一个 符号的最长字符串。也就是说,每一个符号应该包含尽可能多的字符。换句话说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入 ,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的原创 2014-07-22 10:28:10 · 1862 阅读 · 0 评论 -
函数中char c[]="hello"与char * c = "hello"区别 -- C
char c[]="hello"是局部数据。char * c = "hello"全局数据,在静态存储区域。#include <stdio.h>/* 例子一 */const char * strA(){ /* 正确 通过static开辟一段静态存储空间 */ static char str[] = "hello"; /* 错误 分配一个局部数据,函数结束内存的栈释放 返回后的结果是不确定的且不安全,随时都有被回收的可能*/ char str[] = "hello";原创 2014-07-29 13:24:01 · 1450 阅读 · 0 评论 -
引用 互换变量值 -- C
#include <stdio.h>voidswap(int * p, int * q){ int tmp; tmp = *p; *p = *q; *q = tmp;}voidswap1(int &p, int &q){ int tmp; tmp = p; p = q; q = tmp;}intmain(){ int a = 1, b = 2; /* 大家都见过,不多做解释 */ swap(&a,&b); printf("a = %d, b = %d\原创 2014-07-29 11:17:09 · 843 阅读 · 0 评论 -
引用 与 指针的区别 -- C
简单的说:引用 -- 变量别名指针 -- 存地址#include <stdio.h>intmain(){ /* 声明一个引用reiv1,同时初始化,也就是reiv1是iv的别名*/ int iv; int & reiv = iv; /* 声明一个引用,但引用不能为空,必须同时初始化*/ // int & reiv1; /*错误:‘reiv1’声明为引用却未被初始化 */ iv = 13; printf("iv = %d\n", iv); printf("reiv = %原创 2014-07-29 10:58:32 · 962 阅读 · 0 评论 -
ptr = malloc(0);
#include <stdio.h>#include <stdlib.h>#include <string.h>/*避免错误:size 进行判断后在进行动态分配。为什么? malloc在不同编译器上有不同的实现,有的申请0大小返回NULL,有的就可以返回一个地址,似乎后者较为常见。 当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额外的内存来存储我们的内存块信息,用于维护该内存块。 其实内存是分片的, 比喻说你malloc(10); 不是真的给你10个字节,原创 2014-08-04 15:47:43 · 966 阅读 · 0 评论 -
#define 中的UL
c语言 #define 中的ULU和L是 整数文字量的后缀修饰,用于显示指明整数文字量的类型为unsigned int(U)和long int(L)。 类似的还有浮点数文字量的后缀修饰F或f,用于指明文字量表示的是一个float,而不是默认情况下的double。经常发现一些C语言中通过#define 定义的数据中包含有UL符号,不理解为什么,把他去掉发现也没有什么区别。现在才明转载 2014-02-17 13:06:05 · 1124 阅读 · 0 评论