最近在看《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);