数组和指针并不同(总结《C专家编程chap4》)

左值(地址)和右值(地址的内容):
数组和指针并不同(总结《C专家编程chap4》)_第1张图片
 

 

1. 使用数组_直接引用:因为符号表中,符号a对应的值就是a数组的首地址。
数组和指针并不同(总结《C专家编程chap4》)_第2张图片

2. 使用指针_间接引用:因为符号表中,符号p的值是“地址”,需要从内存中取得对应的“地址的内容”,然后才能像“访问数组元素”那样进行元素的访问。
数组和指针并不同(总结《C专家编程chap4》)_第3张图片
 

混合两种方式:
数组和指针并不同(总结《C专家编程chap4》)_第4张图片
 

 

 

代码示例:

 

#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;
}

 

 

 

 

你可能感兴趣的:(编程)