C++指针的理解
本文摘自
深入理解C/C++中的指针
-
指针变量可通俗地理解成存储指针的变量,也就是存储内存地址(内存编号)的变量
-
指针变量也是一个变量,它是一个用来存储其他变量的内存地址的,更准确地说,指针变量时用来存储其他变量的内存首地址的,因为不同的数据类型所占的内存大小不一样
-
由于&b是一个指针常量,所以写成&b - -是错误的
-
数组名表示这个数组的首地址
-
arr
和arr[0]
和&arr[0][0]
表示的都是同一个地址,但是这三个首地址在进行算术运算时是有区别的:
&arr[0][0] + 1
,相当于跳一个int型元素的内存字节数,也就是4个;
arr[0] + 1
,相当于在一维数组中跳了一个元素,所以移动的内存字节数也是一个int型元素所占的字节数,也是4个;
arr + 1
,这个时候移动的内存数目是一行,即4*4=16个字节数 -
void
型指针作为指向抽象数据的指针,它本质上表示一段内存块。如果两个指针类型不同,在进行指针类型赋值时必须进行强制类型转换 -
C/C++程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址
-
C/C++规定函数名就表示函数入口地址,所以,函数名赋值时函数名前面加不加取地址符
&
都一样,也就是说PF pf = f
等价于PF pf = &f
。这个&
是可以省略的。但是这是单个函数的情况,在C++中取类的方法函数的地址时,这个&符号式不能省略的,见下面的例子: -
作为回调函数(callback)
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#中的关键字对比
在Java
或者C#
等语言中,通过new
关键字定义一个对象,直接得到Object
的实例,也就是说后续引用这个对象,我们可以直接使用obj.property
或者obj.method()
等形式,但是在C++中
不行,比如用一个指针去接受这个new出来的对象,我们引用这个对象必须使用指针引用运算符->
,也就是我们需要这样写:pObj->property
或pObject->method()
。代码如下:
当然C++中还有一种不需要使用指针就可以实例化出来类对象的方法,从Java、C#等转向C++的程序员容易误解为未初始化对象变量的定义,看下列代码:
在C++中,this
关键字是一个指针,而不是像在Java
、C#
中是一个类实例。也就是说,在C++中*this
才等价于Java
、C#
中的this
。所以写法也就不一样了:
- Windows编程中的指针