〇:c语言中左值、右值和赋值操作
x = y;
左值:在上下文环境中,编译器认为x的含义是x所代表的地址。这个地址只有编译器知道,在编译的时候确定,编译器在一个特定的区域保存这个地址。
右值:在这个上下文环境中,编译器认为y的含义是y所代表的地址里面的内容,这个内容是什么,只有到运行的时候才知道。
一、数组相关操作和概念
1.搞清楚数组做左值和右值的区别,对理解指针数组很重要,如下代码
中第2行和第3行的作用是等价的,数组名在做右值的时候,就表示数组首元素的首地址,而数组名不能做左值。
2.&a[0]和&a的值虽然相同,但是两者意义不同,&a[0]表示数组中元素的地址,&a代表整个数组的地址。
int a[]={1,2,3,4,5};
int *p = a;
p = &a[0];
二、数组和指针的区别和联系
1.指针和数组是不同的两个概念,只是两者都可以用下标或者指针的方式进行访问;
2.指针的访问方式是匿名的访问方式,数组的访问方式是具名加匿名的方式访问的;
3.传递数组参数给函数的时候,数组就会退化成常量指针,形参接收到的是数组首元素的地址,而不是整个数组的元素内容;
4.数组的初始化或者赋值使用的是值传递的方式,如下
int array[5];
int a = 10;
array[0] = a; //这一步的操作是将a的值复制一份然后放入array[0]中
三、指向数组的引用
int array[5] = {0};
int (&p) [5] = array; //定义方式和定义一个数组指针类似
cout << sizeof(array) << sizeof(p) <<endl; //都是20