在C++编程中使用指针能有速度快,节约内存等优点,是很多C++程序员的最爱。但指针是一把双刃剑,用好了它,你就会发现指针有多么的方便,反之,你可能就头疼了,往往会出现意想不到的问题。
一。什么是指针:
其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针只是一个指示器,它告诉程序在内存的哪块区域可以找到数据。
这是一个非常重要的概念,有很多程序和算法都是围绕指针设计的,如链表、遍历等。
指针是一个数据类型,本身也需要占用四个字节的存储空间。所以用sizeof(void*)获得的值为4.
二。指针的定义
看如下的例子:
int *pNumber;
这样就定义了int类型的指针。
指针变量名称以p为首字符,这是程序员通常在定义指针时的一个习惯,以提高便程序的阅读性,表示这是个指针。另外,虽然int* pNumber和int *pNumber是相同的,但是使用后一种的编程风格更好一些。比如:
int *pNumber1,*pNumber2;表示定义两个指针,*号和变量靠近;反之,我们可能会定义成int* pNumber1,pNumber2,这将是一个错误的定义,pNumber2就不是指针了。
三。指针的优点
a.为函数提供修改调用变元的手段;
b.支持C++动态分配子程序
c.可以改善某些子程序的效率
d.为动态数据结构(如二叉树、链表)提供支持
四、指针赋值及转换:
a.同类型直接赋值,异类型要进行转换。
b.强制转换:可以把表达式结果硬性转换为指定类型
c.char * p;(int *)p 把p强制转换为int型,记住转换过程中要注意两个类型的大小,大转小时可能会有数据丢失(如int到double)
d.涉及void *的:
c 中void *类型可赋值给任何类型的指针,反之亦然
c++ 中都需要强制转换
void * 可看作无穷大能接纳任何类型赋值,反之不行int * p =9;void * t= p(正确);p=t(错误)
e.不涉及void *的都要强制转换
五。指针和数组
不带下标的数组名返回数组的起始地址,即数组首元素的地址,所以对数组的访问可有两种方式:数组下标和指针算术。例如:
char* pChar;
char chs[100];
pChar = chs;这样pChar就指向chs数组的首地址。
六。数组与引用