C语言特殊知识点解析

1 数组

1.1 概念

  数组是指某种数据类型,在内存上按照顺序存储。中括号([ ])是数组的标识,中括号内的数值标识该种数据类型变量的个数,中括号也有取值的作用

1.2 数组使用

  int a[10]={1,2,3,4,5,6,7,8,9,0};  --数组的定义
  int *p=&a[1];  --a[1],是取数组a在内存1位置的值,&a[1],是取a[1]的地址

  则p[6]等于8  --p[6],是以&a[1]为起始位置,向上取第六位置的值。

1.3 整数数组清零

1.3.1 bzero()

  只能清零。  

1.3.2 memset()

  可以设定为指定的值。但是,只会置每个字节的低位为指定值。例如:  

  int a[5] = {1,2,3,4,5};
  memset(a,2,sizeof(a));
  for(int i=0; i<5; i++){
    printf("%d", a[i]);  --打印的值为:10000000100000001000000010
  }

2 存储类关键字

2.1 auto

  只用于具有代码块作用域的变量声明中,修饰局部变量。

2.2 register

  只能是局部变量,并且是CPU可以接受的类型,不能取址。可以大大提高运算效率。

2.3 static

  (1)static修饰全局变量,只初始化一次,防止在其它文件也被使用。

  (2)static修饰局部变量,函数执行完,static变量不会释放。

  (3)static修饰函数,该函数只能在本文件使用。

2.4 extern

  声明某变量或者函数可外部调用。

2.5 const

3 有符号整形和无符号整形的运算

int main(void)
 {
   unsigned int a = 6;
   int b = -20;
   char c;
   (a+b>6)?(c=1):(c=0);

   return 0;
 }则c=1,但a+b=-14;如果a为int类型则c=0。

   原来有符号数和无符号数进行比较运算时(==,<,>,<=,>=),有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数),
 比如上面 (a+b)>6这个比较运算,a+b=-14,-14的补码为1111111111110010。此数进行比较运算时,被当成了无符号数,它远远大于6,所以得到上述结果。
 

4 原码、反码、补码

  因为有符号的原码的真实值不准确,所以出现反码;因为-0这个特殊的值,所以出现的补码。所以,处理器计算的是补码。

5 可重入函数和不可重入函数

  不可重入函数指的是该函数在被调用还没有结束以前,再次被调用可能会产生错误。可重入函数不存在这样的问题。

  不可重入函数在实现时候通常使用了全局的资源,在多线程的环境下,如果没有很好的处理数据保护和互斥访问,就会发生错误。
  常见的不可重入函数有:
    printf --------引用全局变量stdout
    malloc --------全局内存分配表
    free    --------全局内存分配表
  在unix里面通常都有加上_r后缀的同名可重入函数版本。如果实在没有,不妨在可预见的发生错误的地方尝试加上保护锁同步机制等等。

 

  

 

转载于:https://www.cnblogs.com/campus16/p/9425184.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值