c语言的一些高级用法

最近在看《c和指针》,每天会更新一些,如有错误望指正。

static只改变链接属性为internal,并不改变作用域,局部变量仍然是局部变量,但是会将其存储区由堆栈改为存储器,也就不会重复初始化。

有符号数的左右移位是算数移位还是逻辑移位取决于编译器,所以不可移植。无论什么移位都不要移位负数。

逗号的作用和分号的作用差不多。

可以用预编译#if 0 { }      #endif 来注释。

关于指针,定义一个指针*p,其实分为两部分,p是其内存地址,对普通变量用&也可以得到其地址,*p是其指向的值,可以把*号理解成是对地址的解码操作。其在定义时的赋值,其实是对地址p的赋值,而不是*p。如int *p=&a,其实可以理解为int *p;p=&a。之后如果再修改a,&a并没有改变,地址p也是这个值,但是对这个地址解码后的值却变了,所以a和*p的值都变为了新的a。但是如果先定义了int *p=&a,之后又让p=&a+1,此时地址p和&a就不一样了,两者所指向的值就没有关系了,所以改变地址&a指向的值a,*p并不会改变。注意&a=1000;p=&(a+1)都是不合法的,p=6422260虽然也不合法,在一些编译器上却是可以使用的,要注意这个地址要存在,正因为如此,int a;int *p=a在一些编译器上也可以用,此时就是把a的值当作一个地址赋给了p。之后如果改变a,对地址&a的解码变了,但是地址p并没有改变,对地址p的解码*p更没有改变;而如果更改的不是a而是p,地址p变了,对p的解码*p自然也变了,但是&a并没有改变,所以a也没有变。

int a;
a=1;
int *p=&a;
printf("*p=%d,p=%d\n",*p,p);  
a=2;
printf("*p=%d,p=%d\n",*p,p);  
p=&a+1;
a=3;
printf("*p=%d,p=%d\n",*p,p);  
p=6422280;
printf("*p=%d,p=%d\n",*p,p);  
a=6500000;   //a太小时地址不存在,打印不出来
p=a;
printf("*p=%d,p=%d\n",*p,p);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值