《C专家编程》学习记录

一、指针和数组不同的地方

  “地址y”和“地址y的内容”之间的区别,不能定义时是指针,引用时却是数组,如不能定义char test[100]; 引用时却用extern char*test;

  举例,X=Y,其中X是变量名,用Y给X赋值;

  X的含义是X所代表的地址,X是左值,左值在编译时可知,左值表示存储结果的地方。
  Y的含义是Y所代表的地址的内容,Y是右值,右值在运行时才知,如无特别说明,右值表示“Y的内容”。

  编译器为每个变量(左值)分配一个地址,这个地址在编译时可知,并且该变量在运行时一直保存在这个地址。相反,存储在变量中的值(右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量并将它存于寄存器中。

  

   由上图,a是一个数组,也是一个内存地址,数组内的字符可以从这个地址找到。编译器只需要起始地址和偏移地址,就可以从数组提取字符。

  p是一个指针,它指向的对象是个字符。为了获得这个字符,须得到地址p中的内容,并把这个内容作为字符的地址,并从这个地址中取得这个字符

  以上,当定义一个数组char p[100],却用指针char *p声明后,用p[i]这种形式提取这个声明的内容时,实际得到一个字符,编译器却把它当成是一个指针,可能会出现莫名其妙的错误,污染程序地址空间。故对于数组和指针,定义和声明时应该一致。

 

  

猜你喜欢

转载自www.cnblogs.com/keepdoing123/p/12133802.html