高级C语言教程-关键字和运算符

volatile 关键字
一个定义为volatile的变量会被意想不到的改变,这样编译器就不会假设这个变量的值了,精确的来说就是编译器在用到这个变量的时候必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里面的备份;
一个参数既可以是const也可以是volatile,一个经典的例子就是只读状态寄存器,它是volatile,因为它可能会被意想不到的改变,它是const因为程序员不应该试图去改变它;
一个指针可以是volatile尽管这样并不常见,例如一个中断服务子程序修改一个指向buffer的指针的时候;
转换方程:
a + = 表达式; => a = a + (表达式);
逗号运算符
不管你相信与否逗号运算符确实是合法的C运算符,逗号的运算符是将两个或者多个表达式分隔开,这些表达式是自左向右依次的求值整个逗号表达式是最后也是最右边那个表达式的值。
例如:
if( a + 3,b / 2,c >= 0);
其实if条件是否成立仅仅取决于c>=0是否成立,也就是最右边的值才是最终的值;
条件运算符
条件运算符是C语言运算符中唯一的三目运算符,条件运算符的使用方法如下:
表达式1?表达式2:表达式3
条件运算符的优先级非常的低,(仅比赋值运算符和逗号运算符的优先级高),因此作为各个操作数的表达式一般不需要加括号。
如果你爱编程,你就应该爱C语言,如果你爱C语言,你就应该爱指针,如果你爱指针你就应该爱函数指针,指针是C语言中最有魅力也是最有争议的元素,是天使与魔鬼的统一体,,正是由于C语言对指针的灵活支持(至少一个非常重要的原因),C语言几乎是编写系统软件(包括操作系统,编译器等软件)的首选语言。
理解C语言的关键就是理解真正的存储器。

每一个存储单元都有两个属性,一个是存储器里面存放 的内容,二是这个存储单元的地址(事实上,地址也是数据,只是地址的特殊性)。


  1. malloc(0)在我的系统里是可以正常返回一个非NULL值的。

  2. malloc(0)申请的空间到底有多大不是用strlen或者sizeof来看的,而是通过malloc_usable_size这个函数来看的。—当然这个函数并不能完全正确的反映出申请内存的范围。

  3. malloc(0)申请的空间长度不是0,在我的系统里它是12,也就是你使用malloc申请内存空间的话,正常情况下系统会返回给你一个至少12B的空间。这个可以从malloc(0)和malloc(5)的返回值都是12,而malloc(20)的返回值是20得到。

  4. malloc(0)申请的空间是可以被使用的。

  5. malloc只有申请失败的时候才会返回NULL剩下的malloc(0)等下雨12的全部申请的是12B,可能不同的系统申请的大小是不一样。


指针是变量的地址,在C语言中关于指针的运算有以下几种,:

1.同类型的指针可以做加减运算。

2.同类型的指针可以比较大小

3.除控类型指针(void *)之外,指针可以加上一个整数或者减去一个整数。

4.除空类型指针外(void *),指针是可以进行自增(++)自减(–)的运算。


char *p,*q;
p = "Hello!";
q = p;
q[0] = 'h';

在ANSI C标准中字符串常量是存储在 string literal pool 中的,并且ANSI C禁止对string literal pool 进行修改,因为对于上面的例子中”Hello!”,编译器或者连接器会将这个常量串映射到ROM等只读区内存区,因此如果对这个区域进行写操作的话很可能会引起总线的错误对于ARM而言就可能是Data Abort)。
然而代码修改成:

char *q;
char *p = "Hello!";
q = p;
q[0] = 'h';

就是正确的了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achou.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值