在C++中经过动态建立的对象,咱们只能得到一个指针,并经过指针控制它。指针是存放对象的内存地址值,更准确的描述是对象的起始地址值。每个指针都有一个相关的类型,不一样数据类型的指针之间的区别不在指针的描述上,也不在指针所持有的地址上。而在于编译器如何解释特定内存地址上的内容。例如,在32位机器上,一个int型的指针地址在1000处,它跨越的寻址空间是1000~1003。一个double型的寻址空间是1000~1007。编程
这样咱们就很容易理解在C++中,要给函数传递一个数组指针还必须告诉函数数组的长度。数组
1、是常量指针仍是指针常量框架
在使用指针的时候,首先容易混淆的如下两个概念:函数式编程
1)const T *pt;函数
2)T *const pt;spa
3) const T *const pt;指针
第一个变量的含义是:pt是一个指针,这个指针的类型是const T。换句话说,你不能修改指针地址指向的值,可是你能够修改地址。code
第二个变量的含义是:pt是一个常量指针,这个指针的类型是T。你能够修改指针地址的值,可是不能够修改地址。对象
第三个变量的含义是:你既不能修改值也不能修改地址。blog
2、为何有些函数的形参是指针的指针
咱们常常会在一些第三方框架提供的函数接口中看到相似的形式(**T),这一般表示在函数内部会修改他们的地址。因为C++的函数参数传递是经过copy完成的,指针类型在函数内部没法经过改变地址的方式影响外部变量,例如:
int val = 5; void chg(int *pi) { pi = &val; } void free(string *ps) { ps = NULL; } int main() { int idx = 1; chg(idx); cout << idx; // idx == 1 string *s = new string("hello"); free(s); cout << *s; // hello }
仅仅经过传递指针类型没法达到效果。
3、指向函数的指针
时下流行的函数式编程须要咱们将函数做为参数传递给另外一个函数调用,函数指针是一个理想的实现方式。
int compare(const string &s1, const string &s2){} 函数指针的表达形式能够是这样:int (*pf)(const string &, const string &)。