整理记录一些C语言知识点;
更新中...
1.左值,右值
常见的一个错误,
int a[10];
printf("%d",&(a+1));eror C2102:'&'requires L-value就是说运算符&需要一个左值类型的变量;
左值,即可以放在等号左边的值,即内存地址;
右值,即可以放在等号右边的值,即变量的值或表达式;
下面这个翻译的很好,
L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address.
R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language.
上面例子中的,(a+1)计算后是一个数值,而&a是正确的,a是一个有确定地址的数组,a是一个内存的地址;
另外,&a+1,表示的是...对整个数组加1;
另外...
还有一个经典的笔试题...
void main(){ int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1));}输出为 2,5a与&a的值是一样的,但含义不一样,a表示数组的首地址,即&a[0],对第一个元素取地址,&的对象是元素,所以a+1,即&a[0]+1,偏移一个sizeof(int);&a表示对数组进行取地址运算,&的对象是数组,所以&a+1是指下一个对象的地址,即数组(对象)后加1,相当于a[5];而指针变量 ptr指向a[5],所以*(ptr-1),(ptr-1)就是a[4],所以*(ptr-1)为5;如果数组a的地址是 0x0000,那么a+1是0x0000+sizeof(int),&a+1是0x0000+5*sizeof(int)从这里也可以看出来....操作符*要加右值运算;
下面附张操作符的运算表,