1. 用于声明变量的表达式和普通表达式在求值时所使用的规则相同;
2. 转移表就是一个函数指针表达式;
3. int main(int argc, char* argv[], char* env[]) ,如果*argv为NULL,那么**argv的第二个间接访问就是非法的,实际上是对空指针进行解引用;
4. 当一个字符串出现在表达式中时,它的值是一个指针常量;
常量指针就是指向常量的指针,指针所指向的内容是不可修改的;指针常量就是指针的常量(指针是常量),它是不可改变地址的指针,但是可以对它所指向的内容进行修改。
...............................................................................................
(以下内容来自:小祥的BLOGhttp://xfxsworld.cnblogs.com )谢谢!蓝色波浪线中间部分
常量指针,就是指向常量的指针,关键字 const 出现在 * 左边,表示指针所指向的地址的内容是不可修改的,但指针自身可变。
指针常量,指针自身是一个常量,关键字 const 出现在 * 右边,表示指针自身不可变,但其指向的地址的内容是可以被修改的。
例:
常量指针: const char* ptr = “hello”
指针常量: char* const ptr = “hello”
另外常量指针有两种写法:const既可写在类型前,又可写在类型后。如上面的例子,常量指针:char const * ptr = “hello” 也是正确的。
最后再举个例子,与迭代器经常在一起用。
若希望迭代器所指向的东西不可变,则需要的是 const_iterator。例:
std::vector<int>::const_iterator Iter = vec.begin();
*Iter = 10;//错误,Iter是常量指针
Iter++;//正确,Iter本身可变
若希望迭代器本身不可变,指向的内容可变,则可以这样写:
const std::vector<int>::iterator Iter = vec.begin();
*Iter = 10; //正确,指针常量
Iter++; //错误,指针本身不可变
...............................................................................................
5. 使用转移表必须验证下标的有效性,访问数组当然不可以越界;
6. 没遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?指向了哪里?
7. 指针表达式也具有指针所具有的四个要素:指针的类型;指针所指向的类型;指针指向的内存区;指针自身占据的内存;