左值(地址)和右值(地址的内容):
1. 使用数组_直接引用:因为符号表中,符号a对应的值就是a数组的首地址。
2. 使用指针_间接引用:因为符号表中,符号p的值是“地址”,需要从内存中取得对应的“地址的内容”,然后才能像“访问数组元素”那样进行元素的访问。
混合两种方式:
代码示例:
#include <iostream> using namespace std; int main(){ //1. 理解"左值"(数组是"不可修改的左值")和"右值" //2. 符号表中: // (1)变量名a的值为 a的地址内容==> a[i]是直接引用 // 因此,整个过程取一次内存 // (2)变量名p的值为 p的地址==> 先从"p的地址"取得"p的地址内容"==> *(p+i)是间接引用 // 因此,真个过程取两次内存 char *p1="abcdefg"; cout<<p1[0]<<endl; cout<<"符号表 (变量名->变量值)"<<endl; char a1[]={'a','b','c'}; char *p3=a1; cout<<"符号表中变量a1的值 : "<<(int *)&a1<<endl; cout<<"数组a1的首地址 : "<<(int *)a1<<endl; cout<<"符号表中变量p3的值(p3的地址) : "<<(int *)&p3<<endl; cout<<"p3的地址内容 : "<<(int *)p3<<endl; cout<<*a1<<endl; cout<<*p3<<endl; cout<<p3[0]<<endl; cout<<*(p3+1)<<endl; //3. 指针和数组的分配空间 //(1)定义指针时,为指针分配了空间,不为指向的内容分配空间 //特例:若指针指向"只读字符串",编译器"指针"和"指向的内容"分配空间 char *p4="breadfruit"; //*(p4+1)='4'; 只读 cout<<p4<<endl; //否则,编译错误 //float *p5=3.141; //(2)数组则是分配空间的,指向的字符串是"读写"的 char a[]="gooseberry"; a[1]='4'; cout<<a<<endl; return 0; }