C++指针的理解

本文摘自
深入理解C/C++中的指针

  1. 指针变量可通俗地理解成存储指针的变量,也就是存储内存地址(内存编号)的变量

  2. 指针变量也是一个变量,它是一个用来存储其他变量的内存地址的,更准确地说,指针变量时用来存储其他变量的内存首地址的,因为不同的数据类型所占的内存大小不一样

  3. 由于&b是一个指针常量,所以写成&b - -是错误的

  4. 数组名表示这个数组的首地址

  5. arrarr[0]&arr[0][0]表示的都是同一个地址,但是这三个首地址在进行算术运算时是有区别的:
      &arr[0][0] + 1,相当于跳一个int型元素的内存字节数,也就是4个;
      arr[0] + 1,相当于在一维数组中跳了一个元素,所以移动的内存字节数也是一个int型元素所占的字节数,也是4个;
      arr + 1,这个时候移动的内存数目是一行,即4*4=16个字节数

  6. void型指针作为指向抽象数据的指针,它本质上表示一段内存块。如果两个指针类型不同,在进行指针类型赋值时必须进行强制类型转换

  7. C/C++程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址

  8. C/C++规定函数名就表示函数入口地址,所以,函数名赋值时函数名前面加不加取地址符&都一样,也就是说PF pf = f等价于PF pf = &f。这个&是可以省略的。但是这是单个函数的情况,在C++中取类的方法函数的地址时,这个&符号式不能省略的,见下面的例子:
    C++指针的理解

  9. 作为回调函数(callback)
    C++指针的理解

10.在C99标准规定,只有以下两种定义方式是正确的的:

int main(void);
int main(int argc,char *argv[]);

11.传值还是传引用(by value or by reference)
  如果变量类型是基元数据类型(基础数据类型),比如int、float、bool、char等小数据类型被称为基元数据类型(primitive data type),那么赋值时传的是值。也就是说,这个时候b的值是a的拷贝,那么更改b不会影响到a,同理更改a也不会影响到b。 
  但是,如果变量类型是复杂数据类型(complex data type),不如数组、类对象,那么赋值时传的就是引用,这个时候,a和b指向的都是同一块内存区域,那么无论更改a或者b都会相互影响。

12.C/C++中的new关键字与Java、C#中的关键字对比
C++指针的理解

Java或者C#等语言中,通过new关键字定义一个对象,直接得到Object的实例,也就是说后续引用这个对象,我们可以直接使用obj.property或者obj.method()等形式,但是在C++中不行,比如用一个指针去接受这个new出来的对象,我们引用这个对象必须使用指针引用运算符->,也就是我们需要这样写:pObj->propertypObject->method()。代码如下:
C++指针的理解

当然C++中还有一种不需要使用指针就可以实例化出来类对象的方法,从Java、C#等转向C++的程序员容易误解为未初始化对象变量的定义,看下列代码:
  C++指针的理解

在C++中,this关键字是一个指针,而不是像在JavaC#中是一个类实例。也就是说,在C++中*this才等价于JavaC#中的this。所以写法也就不一样了:
C++指针的理解

C++指针的理解

  1. Windows编程中的指针

C++指针的理解