设为首页 加入收藏

TOP

c基础注意点
2013-01-13 11:08:32 来源: 作者: 【 】 浏览:538
Tags:基础 注意

  1,在c语言中用补码表示负数,如:

  char c = 128;

  printf("%d\n",c);结果是-128,c = 1000 0000 说明是负数,则所表示的负数是-(0111 1111 + 1)为-128

  也可看做c的范围是-128~127,而128已经越界了,则继续表示从-128开始循环

  ------------------------------------------------

  注意:0和正数的补码都是原码。。

  +0:原码:0000 0000,,反码:0000 0000 ,补码:0000 0000

  -0:原码:1000 0000,,反码:1111 1111 ,补码:0000 0000

  1,负数的反码是其原码除符号位外其他位取反

  2,负数的补码是取其反码后加1

  3,字长为8时,-128没有原码和反码,因为1000 0000表示0

  4,补码的出现解决了+0和-0的问题

  2,char *p = malloc(0);

  if(NULL == p)printf("error...\n");

  elseprintf("right...\n");

  p = "abc";是能分配成功的,因为p已经指向了一个确定的地址,不过存在非法访问的问题,,仅仅是引用"abc"的首地址,即把首地址赋给p

  3,浮点型:单精度:有效数字长度为7位 float f1 = 33333.33333 打印出f1 = 33333.332031

  双精度:有效数字长度为16位double d1 = 33333.333333打印出d1 = 33333.333333

  长双精度:19位

  浮点常量默认为double型

  4,char型可看做是int型的一种

  5,enum week{a,b,c,d,e,f,g,h };分别是0,1,2,3,4。。。

  enum week myweek ;sizeof(enum week)和sizeof(myweek)值都是4

  6,唯一的指针常量是NULL,数组名也是指针常量,一个字符串常量出现在表达式中,所引用的值是该字符串常量的首地址。而不是字符

  如:char *str = "linux";str表示的字符型指针指向linux字符串在内存中首地址。。。

  注意区别:char  p[] = "linux";

  char *p = "linux";两种表达形式的字符串的存储方式不一样

  7,变量的存储方式:1,静态存储:static修饰的变量,以及普通全局变量含(extern修饰的)

  2,动态存储:栈。。局部变量(普通局部变量),寄存器变量

  static的作用:1,修饰局部变量可改变生存周期

  2,修饰全局变量可改变作用于范围

  3,修饰函数也是限定作用于范围

  8,typedef的作用:提高程序的可移植性,简化声明const的作用:定义只读变量

  -----1,const int i = 3;此时并未把i放入内存中,在被引用时,int x = i;int y = i;只是给出了变量的地址,都只会产生一份i的拷贝,而宏定义的话则会产生多分拷贝

  -----2,提高效率,编译期间不分配存储空间

  9,%运算和switch(c)。。case中只能用整型量..case中只能用整形或字符型的常量或常量表达式

  10,自动类型转换规则:char,short->int->(unsigned (int) )/ (float) ->long ->double

  11,%s以字符串格式输出时,遇到'\0'结束。

  char *p = "linux";

  gets(p);会出现段错误,p指向一片常量区,不能写,会出现段错误p = "hello";不会错,只是把p改变了指向

  12,二维数组名指向数组首元素的首地址,a ;a[i]表示一个一维数组名,指向一个一维数组首元素元素的首地址,i+1是以列数偏移

  13,c语言内存分配:

  堆区:malloc动态分配,free释放

  栈区:自动分配

  数据段:存放静态变量和全局变量

  ----------------------------------------

  1,常量区(只读数据段):存放字符串常量和const修饰的全局变量,只可被访问不可被写入,生命周期同程序的运行过程,值不能被修改

  2,静态区(普通数据段):存放普通全局变量和所有static修饰的变量

  3,局部变量被const修饰,仍然存放在栈区,可以通过指针改变值,但是不能直接显示的去修改值

  4,普通的整型、浮点型或字符型常量在使用时是通过立即数实现的,并没有额外分配存储区

  -----------------------------------------

  BSS段:未初始化的数据段

  代码段:。。。。

  关键字注意点:

  1,void:任何其他类型的指针可以无需强转赋给void*

  ----void v;不合法,不能代表一个真是的变量

  ----void *v;合法,允许定义一个空类型的指针

  2,const;

  ----修饰只读变量

  ----节省空间,避免不必要的内存分配,提高效率

  ----修饰一般变量,数组,指针,函数返回值和传入参数。

  3,volatile

  4,extern

  5,enum sizeof(。。)为4

  6,typedef和存储类型指示符是等价的,,

  typedef不能和static等存储类型指示符同时使用,因为每个变量只能有一种存储类型=》所以typedef static int int32错误

  typedef int int32;

  unsigned int32 j = 10;错误,typedef 不支持此种替换

  存储类型指示符:extern,static,auto,register

  存储类型指示符的位置是任意的(但要求在变量名和指针*之前)

  int const static t;

  const int static t;

  const static int t;

  static const int t;几种表示方法是一致的。

  上述表达式中的static可以换成typedef

  typedef const int t;  都表示把t表示为const int 类型

  (void (*)())0x1000 跳转到某个地址去执行指令

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇宏中 "#"和".. 下一篇浅析C语言的基础之细节问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: