• ACCP软件工程师
  • BENET网络工程师
  • JAVA+大数据
  • Python工程师
  • 云计算工程师
  • Web前端工程师
  • 软件测试工程师

c基础注意点

2013年01月11日 17:37供稿中心:兆隆教育

摘要: 1,在c语言中用补码表示负数,如: char c = 128; printf(%d\n,c);结果是-128,c = 1000 0000 说明是负数,则所表示的负数是-(0111 1111 + 1)为-128 也可看做c的范围是-128~127,而128已经越界了,则继续表示从-128开始循环 -------------------------------

 

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[3][4];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 跳转到某个地址去执行指令
 
©陕ICP备18020405号-2 Copyright  ©  2001-2018隶属于西安兆隆计算机培训中心版权所有