本文参考资料 C++ Primer, 5e; Coursera北大数据结构与算法课程。
1. 概论
很全面的指针在C\C++语言中是很重要的内容,并且和指针有关的内容一向令人头大。在本教程中,我总结了一些关于指针和数组的用法(尤其是指针和二维数组)。大部分关于指针和数组的问题应该可以再本文找到答案。
2.指针基础
指针是指向另外一种类型的复合类型。
指针本身就是一个对象,允许对指针进行赋值和拷贝;指针无需在定义时赋初值。
指针定义
“&”是取地址操作符。
int num=1;
int *p=# //(&是取地址操作符)
利用指针访问对象
使用解引用操作符“*”。
cout<<*p<<endl;
输出结果为1。
指针的状态
- 指向一个对象
- 指向紧邻对象所占空间的下一个位置
- 空指针 int *p=nullptr;
- 无效指针
指针作为条件判断参数
例如:
if(p){}
只要指针p不是0,那么条件就为真。
另外值得注意的是,对于两个类型相同的指针,可以用“==”或者“!=”来比较。若两个指针存放的地址相同,则它们相等,否则不等。
3. 指针进阶
指向指针的指针
由于指针是对象,所以指针也有自己的地址。因此,C++语言允许把一个指针指向另一个指针。
例子:
int i=9;
int *p1=&i;
int **p2=&p1;
cout<<i<<endl<<*p1<<endl<<**p2<<endl;
结果是打印3个9。
指针与const限定符
这里有2个初学者容易混淆的概念,及指向常量的指针和常量指针。根据其英文名字可能比较容易记住:
指向常量的指针(pointer to const)是说这个指针是一个普通的指针,它指向了一个常量,如果你愿意,它也可以指向其他对象,并且可以令一个指向常量的指针指向另一个非常量;
const double pi=3.1415;
double *p1=π//error for p1 is a general pointer
const double *p2=π//correct
*p2=6.28;//error for pi is a const variable and p2 is const
常量指针(const pointer)是说这个指针本身就是一个常量对象,所以它不能指向其他对象,但是不意味着它不能改变所指向对象的值。
int num=9;
int *const p1=#//correct, but remember that p1 cannot point to other objects
*p1=18;//correct. You can use the const pointer to change the value of a unconst variable
const double e=2.71;
const double *const p2=&e;//p2 is a const pointer points to a const object
4. 一维数组的定义与初始化
定义
int arr[10];//含有10个整型的数组
int *arr2[3];//含有3个整型指针的数组
一般情况下,数组的元素被默认初始化。
显示初始化
int arr[]={
1,2,3};
int arr2[4]={
1,2,3,4};
可以用字符串字面值初始化字符数组,但是需要记得字符串字面值结尾有一个空字符。
char arr[5]={
'h','e','l','l','o'};//correct
char arr[5]="hello";//error, initilizer-string for the chars array is too long
访问数组元素
使用下标访问数组元素,