数组和指针并不同(总结《C专家编程chap4》)
左值(地址)和右值(地址的内容):
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;
}