C和指针(3)指针

来源:互联网 发布:平面设计软件下载 编辑:程序博客网 时间:2024/04/18 20:45

第六章

(1)变量与内存位置之间的关联并不是硬件所提供的,它是由编译器来实现的。变量只是提供了一种更为方便的方式来记住地址。其实硬件仍然通过地址来访问内存位置。

(2)NULL指针并未指向任何东西 ,因此,对一个NULL指针进行间接访问操作是非法的。在对指针进行间接访问之前,首先必须确保它并非NULL指针。

(3)间接访问指针既可以作为左值使用又可以作为右值使用。作为左值使用时,表达式指定需要进行修改的位置。当作为右值使用时 ,它就是提取当前存储于这个位置的值。

(4)把整型值转换为指针或把指针转换为整型值是极为罕见的,通常这类转换属于无意识的错误。int    *p=&a;p=10-*p;//这条语句是非法的

(5)*100=25;这条语句非法,因为字面值100的类型是整数,而间接访问操作只能作用于指针类型表达式。如果确实想把25存储于位置100,必须使用强制类型转换。

           *(int *)100=25;\\强制类型转换把值100从“整型”转换为“指向整型的指针”,这样对它进行间接访问就是合法的。此技巧只用于需要通过地址访问内存中某个特定位      置。

(6)int a=12;

  int *b=&a;

          int **c=&b;

          *操作符具有右结合性,故最后一个表达式相当于*(*c),我们必须从里向外逐层求值。*c访问c所指向的位置,这是变量b。第二个间接访问操作符访问这个位置所指向的地  址,也就是变量a。

(7)char ch='a';

  char *cp=&ch;//++cp、cp++这两个表达式的值都不是合法的左值。如果在表达式中增加了间接访问操作符,它们就可以成为合法的左值。

  &ch可以当作右值使用,但不能作为左值使用。因为这个表达式并未标识任何机器内存的特定位置,所以它并不是一个合法的左值。

(8)*(cp+1)这里要注意指针加法运算的结果是个右值,因为它的存储位置并未清晰定义。如果没有间接访问操作这个表达式将不是一个合法的左值。 然而,间接访  问跟 随指针访问一个特定的位置。这样,*(cp+1)就可以作为左值使用,尽管cp+1本身并不是左值。 

(9)*cp++这里涉及三个步骤:1、++操作符产生cp的一份拷贝。2、然后++操作符自己增加cp的值。3、最后,在cp的拷贝上执行间接访问操作。

(10)指针运算只有作用于数组中其结果才是可以预测的。对任何并非指向数组元素的的指针执行算术运算是非法的。如果一个指针减去一个整数后,运算结果产生的指针指  向的位置在 数组第一个元素之前,这也是非法的。加法运算稍有不同,如果结果指针指向数组最后一个元素后面的那个内存位置(但不能对这个指针执行间接访问操作,因为很可能会失败),不过再往后就不合法了。

0 0
原创粉丝点击