C语言
文章平均质量分 75
zlingh
大家多多交流我邮箱是[email protected]
展开
-
c语言中static用法和extern
c语言中static用法static在c里面可以用来修饰变量,也可以用来修饰函数。先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不是堆,不要弄混。int a ;int main(){ intb ; int c* =(int *)malloc(sizeof(int));}a是全局变量,b是栈变量,c是堆变原创 2012-11-07 22:24:42 · 520 阅读 · 2 评论 -
还是指针和函数传参的问题
首先,不管java还是c++传参都是按值传递比如有int a=10;int *p=&a;int *q=p;则p,q都指向同一片内存地址,且该片内存的地址值为10。但是p,q这两个地址(指针)变量的地址是不一样的,也就是说若改变p的指向,q的指向还是不变可以看下面例子,为啥要用**p,*p是不行的,用*p的话,调用函数getmemory时相当于有char*p=str也即把p这个原创 2012-11-07 22:22:50 · 369 阅读 · 0 评论 -
C++指针
1:返回引用的的函数。和一般的函数相比,只要在返回值类型后加上&符号即可,函数就会返回return后变量的的引用。如int array[5]={1,2,3,5,7}; int& index(int i){return array[i];}执行index(4)=3;以后array[[4]的值会赋值为3.只能返回全局变量和静态变量,不能返回方法内部定义的变量-局部变量。2:原创 2012-11-07 22:21:35 · 273 阅读 · 0 评论 -
C指针基础
函数内声明的变量和形参都是局部变量,它们的生存周期都是函数的作用范围,当函数执行完毕,它们的内存空间都会被释放,这点要注意。引用就是别名int* 也可以和int一样看成是一种数据类型,int型的指针。若要声明两个指针变量 p1,和p2,则要如下方式写int *p1,*p2;如果写成 int *p1,p2;则p2会被声明成一个普通的变量常量指针:const int *a;a指向的内存可原创 2012-11-07 22:21:56 · 265 阅读 · 0 评论 -
二维数组相关,指针,地址
先从用指向行的指针操作二维数组说起:inta[][2]={1,2};int(*p)[2]=NULL;p=a;接下来可以用p来代替a访问二维数组,如p[0][0];为什么不能用 int *p[2];呢?首先,比如intb[2],此时b是一个数组,且是个指针常量,是不能赋值的,同样p也是个指针常量,不能用p=a来赋值。但我们可以这样:int a[][2]={1,2,3,4};in原创 2012-11-07 22:21:59 · 476 阅读 · 0 评论 -
注意,float和double的精度
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。也就是说8位数的int和float之间转换就会出问题1. 范围 float和double的范围是原创 2012-11-01 22:17:08 · 2641 阅读 · 0 评论 -
c语言位域实现10进制转换成2进制
摘自【《C语言开发技术详解》戴建华 等编着 ;电子工业出版社】有改动[cpp] view plaincopy#include "stdafx.h" #include #include struct byte1{ unsigned char b0:1; unsigned char b转载 2013-10-14 22:24:57 · 1134 阅读 · 0 评论 -
不定参数函数
一:首先,java中的不定参数就是数组,test(Integer...args)可以换成test(Integer[]rgs) package com.bbsoft.test;public class TestManyArgs {public static Integer[] test(Integer... args) { if (args == null) {原创 2012-11-07 22:23:31 · 419 阅读 · 0 评论 -
再解为啥c里函数传入数组时必须同…
当sizeof应用于数组它返回整个数组的字节数,而不是用于定义数组指针的打下(即不是指针类型的的字节数,在32位操作系统指针的字节树是4),用指针的作为参数可以获得指针的大小.另外:sizeof的源码我们看不到,因为它是个运算符看例子:char intArray[]="wo shi shui";int len=sizeof intArray;cout输出的是1原创 2012-11-07 22:23:14 · 347 阅读 · 0 评论 -
C++函数使用形参传入二维数组
C++函数里,如果要使用形参访问二维数组,只能使用指向行的指针向量指向行的指针作为形参有两种写法:“数据类型 形参名[][行长度]”或者 “数据类型 (*形参名)[行长度]”。如f(char a[][3])或者f(char (*a) [3])如:int main(){ int p[2][3]={3,5,5,6,1,9};int m;m=findmax(p,sizeof(p)/siz原创 2012-11-07 22:21:37 · 1096 阅读 · 0 评论 -
error C2664: 不能将参数 1 从“WCHAR [260]”转换为“const char *”
解决方法:1、vs2010 项目-> XXX属性-> 配置属性-> 常规-> 字符集 -> “使用unicode字符集” 改为 “未设置” 就去掉了unicode支持;(已经验证过)2、也可以在#include 之前加上一句#undef UNICODE 有时候好像不太管用3、你全部使用 TCHAR替换char字符串常原创 2012-11-04 16:47:29 · 5846 阅读 · 1 评论 -
size_t
函数形参访问二维数组,使用f(float a[][2])或者f(float (*a)[])当然还可以用引用,但引用编译器编译时也是转为指针。typedef unsigned int size_t;是个无符号整形在C语言中十进制直接表示,例如:1,2,3,4,5,6八进制要加零表示,例如:00,01,02,03,04,05十六进制要加0x表示,例如:0xA1,0x13,0xF原创 2012-11-07 22:23:16 · 320 阅读 · 0 评论 -
字符串处理源码
strlen:size_t strlen(const char *str)//声明为const char*str,常量指针(常量的指针)说明指针所指内容不能改变{assert(str != NULL);//或者assert(str),同一个意思const char*eos=str;//这里不是为了说不改变str,而另外设置一个临时变量。而是str我们必须记住他的初始,以便后面retu原创 2012-11-07 22:23:18 · 302 阅读 · 0 评论 -
C语言运算符优先级
C语言运算符优先级优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右--()圆括号(表达式)/函数名(形转载 2013-10-11 16:07:12 · 704 阅读 · 0 评论 -
malloc()与calloc()等的区别
malloc()与calloc() C语言跟内存分配方式 1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存转载 2012-11-07 09:33:19 · 996 阅读 · 0 评论 -
C中各种内存
待学,还有哈希表的实现,线程与进程的区别,虚函数,虚拟继承原创 2012-11-04 16:44:29 · 352 阅读 · 0 评论 -
C语言中auto,register,static,extern,volatile,restrict,const的区别
变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种。 内存中。具体点来说内存分为三块:静态区,堆区,栈区。外部变量和全局变量存放在静态区,局部变量存放在栈区,动态开辟的内存存在堆区。 一、简要性比较extern 外部变量声明,是指这是一个已在别的地方原创 2014-03-01 20:12:08 · 2052 阅读 · 0 评论 -
static作用(修饰函数、局部变量、全局变量)
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variable转载 2013-10-25 23:11:34 · 567 阅读 · 0 评论 -
C语言中可变参数函数实现原理浅析
1、C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈。例如,对于函数: void fun(int a, int b, int c) { int d; ... }其栈结构为 0x1ffc-->d转载 2013-09-04 15:31:27 · 949 阅读 · 0 评论 -
C语言中形参调用二维数组
int(*a) [3]或者 int[][3]。sizeof(void *),再32位系统下,占4个字节,所以sizeof(void *)=4。二维数组再内存中存放是连续的,所以也可以用一个指针变量访问二维数组。原创 2012-11-07 22:23:49 · 1279 阅读 · 0 评论 -
运算符优先级
1:赋值运算符和复合赋值运算符的优先级一样,都很低,只比逗号运算符高。2:算术运算符里的单目运算符优先级最高,然后乘除,求余,加减。3:算数运算符优先级高于关系运算符。4:移位运算符高于关系运算符,低于算数运算符*/ << &原创 2012-11-07 22:23:47 · 797 阅读 · 0 评论 -
cha与unsigned char的区别
在数据类型转换时有区别:如果是char,系统认为最高位是符号位,那么将对最高位进行拓展如果是unsigned char,系统认为没有符号位,不会对最高位拓展。 对最高位拓展是什么意思呢?char在C里占一个字节,比如0x80的一个char,二进制为10000000,如果转为int则,认为最高位的1是符号位,int是4个字节,剩下的3个怎么办呢,肯定得填充了,系统会在前面填充。如果最高原创 2012-11-07 22:23:40 · 760 阅读 · 0 评论 -
Strcmp函数源码从VC库文件中提取
#include#include#ifdef_MSC_VER#pragmafunction(strcmp)#endif int __cdeclstrcmp ( const char* src, const char* dst ){ int ret =0 ; while( !(re原创 2012-11-07 22:23:24 · 461 阅读 · 0 评论 -
C中的静态变量
静态变量只能初始化一次,当再次运行到该代码段时,就会从静态存储区查找而不会,又初始化一遍,所以如下程序的结果就不难理解了。void Test(){ static int i=0; int j=0; i=i+5; j=j+5; printf("i=%d\n",i); printf("j=%d\n",j);}int main() { Test();原创 2012-11-25 23:26:30 · 1036 阅读 · 0 评论 -
atoi和itoa
atoiatoi的全称是convert ASCII string to integer原型: int atoi(const char *nptr);const char* nptr ; 说明nptr是常量的指针,哪个常量呢,是const char 这个常量,说明这个指针nptr所指向地址的内容是不能改变的,在形参里都是常量指针;指针常量在形参里是没有意义的,指针常量的意思是说这原创 2012-11-25 11:17:31 · 846 阅读 · 0 评论 -
栈内存和堆内存的区别
数组引用变量是存放在栈内存(stack)中,数组元素是存放在堆内存(heap)中,通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问,以下图来说明数组此时的存放形式。那什么是栈内存和堆内存呢?我举例作一一解释。当执行方法时,该方法都会建立自身的内存栈,以用来将该方法内部定义的变量逐个加入到内存栈中,当执行结束时方法的内存栈也随之销毁,我们说所有变量存放在栈内存中,即随着寄存主体原创 2012-11-07 22:25:18 · 415 阅读 · 0 评论 -
calloc(), malloc(), realloc(), free(),alloca()
内存区域可以分为栈、堆、静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的。 利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。 四个函数之间的有转载 2012-11-07 15:41:20 · 576 阅读 · 0 评论 -
C语言之内存操作
http://blog.csdn.net/lqiuiwsb/article/details/6334613http://blog.csdn.net/lqiuiwsb/article/details/6210424http://blog.csdn.net/lqiuiwsb/article/details/6334615http://blog.csdn.net/phoenix001/articl原创 2012-11-07 22:24:19 · 471 阅读 · 0 评论 -
内存操作的函数有这些
http://sunnyshineboy.blog.163.com/blog/static/20281511820124205218764/mmap() -- 建立内存映射void *mmap( void *start,size_tlength,intprot,intflags,intfd,off_toffsize);函数说明:mmap()用来将某个文件内容映射到内原创 2012-11-07 22:24:17 · 339 阅读 · 0 评论 -
C里结构体的内存对齐
http://blog.csdn.net/passball/article/details/5378916http://blog.csdn.net/colinchan/article/details/5319979内存分区:1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2)、堆区(heap) — 一般由程序员分原创 2012-11-07 22:24:15 · 365 阅读 · 0 评论 -
malloc()函数的工作机制
http://www.stubc.com/viewthread.php?tid=1423&extra=page=1&filter=digestmalloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。原创 2012-11-07 22:24:10 · 433 阅读 · 0 评论 -
有关内存重叠的问题
http://blog.csdn.net/feitianxuxue/article/details/7195158内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标地址不重叠,或者使用memmove函数进行内存拷贝。memmove函数对原创 2012-11-07 22:24:08 · 569 阅读 · 0 评论 -
vs里int是低位在前存储的
比如值为2的 int型在内存中数据是:0000001000000000 00000000 00000000所以如下:int a=2;char *ca=(char*)&a;printf("%d",*ca);打印出来的是2,也就说低位在前。----------------------------------------------------------------------原创 2012-11-07 22:24:04 · 1116 阅读 · 0 评论 -
要取int或者float的某个字节方法
首先通过>移位运算符,把int移位,之后再转为byte。C中没有byte可以用char。还有一种,移位以后通过m&0x00 00 ff 00原创 2012-11-07 22:24:02 · 782 阅读 · 0 评论 -
memset是按照字节填充的
void * my_memset(void *dst,int val,int count){ void *p= dst; while (count--) { *(char *)dst= (char)val; dst= (char *)dst+ 1; } return p;} void * my_原创 2012-11-07 22:24:06 · 674 阅读 · 0 评论 -
extern
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 与extern对应的关键字是static,被它修饰的全局变量和函数只能在原创 2012-11-07 22:23:55 · 424 阅读 · 0 评论 -
char*argv[]
char *argv[]char *argv 代表argv是一个字符串而char *argv[]则代表argv是一个字符串数组原创 2012-11-07 22:21:07 · 1071 阅读 · 0 评论 -
float和double的精度问题
http://www.cnblogs.com/BradMiller/archive/2010/11/25/1887945.html float:2^23 =8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 =4503599627370496,一共16位,同理,double的精度为15原创 2012-11-07 22:22:41 · 466 阅读 · 0 评论 -
整数二进制比特反转
int reverse(int m) { int result = 0; for(inti=0;i //while(m)不行 { result |= m&1; result< m> >1; } return result;}原创 2012-11-07 22:23:36 · 957 阅读 · 0 评论 -
常见c函数源码,字符串处理,strcp…
1./ longtotal; int sign; while (isspace((int)(unsigned char)*nptr) ) ++nptr; c =(int)(unsigned char)*nptr++;原创 2012-11-07 22:23:22 · 598 阅读 · 0 评论