C语言基础知识点

整理记录一些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,5
a与&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)

从这里也可以看出来....操作符*要加右值运算;
下面附张操作符的运算表,

 C语言基础知识点_第1张图片

 

你可能感兴趣的:(C语言)