指针是一类包含其他变量或函数的地址的变量。在C++程序里,可以声明指向任何数据类型(包括结构和联合)的指针。除了声明为寄存器存储类的变量外,任何变量的地址都可以用于表达式中。变量的地址可以赋给指针变量,而且还可以作为实参传递给以指针作为形参的函数。函数的地址也可以用于赋值、初始化或者作为其他函数的参数,甚至还可以通过指向函数地址的指针来调用另一个函数。
现在看看关于指针在程序中的一般用法:
注意:
地址运算符&返回的是跟在他后面的标识符的地址。当把变量的地址赋值给指向他的指针之后,就可以用指针运算符*来得到指针所指向的变量的值了。
关于指针的算术运算:
我们可以把指针看成是类似于整型的变量,他们的数值就是内存地址。指针可以加上一个整数,也可以减去一个整数。
和普通整数加减的区别在于:
指针加上或减去的是他指向的类型的大小。不论是加上一个整数还是减去一个整数,指针的运算结果都是一个新的地址值。
指针的加减应该和指针的本身类型有关,虽然指针的大小都是4Bytes,但是指针所指的类型的大小并不一定相同,那么当某类型的指针加一时,他的内存地址必须偏移1个能够容纳那个类型大小的内存。
对指针进行自增运算的语句并不是简单的在指针所表示的地址上加上整数值1。因为该自增运算符石整型的变量,所以自增运算将加上整型变量的大小(一般是4)。因此,即便改变了数组或者让指针指向别的整型变量,自增运算的本质也还是一样的。
上诉代码还能简化为:
注意:
自增运算符++的优先级比指针运算符*低,所以表达式将先取得cdp指向的值,然后再对cdp进行自增运算。如果要先对指针进行自增运算再取它指向的数值,那么这句语句应该写成:std::cout << *++cdp << endl;
有时候我们可能希望对指针的内容而不是指针本身进行自增运算。这时表达式可以使用后缀自增运算符,写成:(*cdp)++
这里圆括号改变了默认的优先级次序,自增运算符作用于指针指向的变量。下面这个表达式则使用了前缀自增运算符:++*cdp
这时就不需要圆括号了,因为自增运算符作用于跟在其后的左值上,这个表达式里的左值就是指针所指向的变量。
优先级规则对自减运算符也同样适用。
再看一个例子:利用指针变量对数组进行遍历:
两个相同类型的指针还可以做减法运算,得到的结果是一个表示这两个地址间该类型数据个数的整数值。
参考资料;
http://blog.mcuol.com/User/Towinembedded/Article/20057_1.htm
http://blog.csdn.net/awen1983/archive/2009/03/17/3998288.aspx