7.1 指针
T表示指向T的指针的类型,T类型的变量能存储T类型对象的地址。
int* pi; //指向int的指针;
char** p //指向字符指针的指针;
int* ap[15] //ap是数组,包含15个指向int的指针;
int (*fp)(char*); //指向函数的指针,接受char*实参,返回int;
int *f(char*); //接受char*实参,返回int;
7.1.1 void*
void* 的含义是指向未知类型对象的指针。
7.1.2 nullptr
nullptr表示空指针,即不指向任何对象的指针。int* x=0; x的值是nullptr;
7.2 数组
定义:假设有类型T,T[size]指包含size个T类型元素的数组。索引范围为0到size-1。
float v[3] //包含3个float类型的数组;
char* a[32] //包含32个char指针的数组;
void f(int n)
{
int v1[n]; //错误;常量表达式,不能是变量。
vector<int> v2(n); //正确;
}
7.2.1数组的初始化器
int v1[] = {1,2,3,4};
char v2[]={‘a’,‘c’,‘d’,0};
如果初始化器提供的元素不足,则自动补0;
int v5[8] ={1,2,3,4};等价于int v5[] = {1,2,3,4,0,0,0,0};
C++没有为数组提供内置的拷贝操作,赋值。把一个数组初始化另一个数组。
7.3 数组中的指针
数组名可以看成指向数组首元素的指针。
int v[] ={1,2,3,4};
int *p1=v; //指向数组首元素的指针;
int *p2=&v[0]; //指向数组首元素的指针;
int *p3=v+4; //指向数组末尾元素的指针;
void fun() {
//数组名向数组首元素指针隐式转换
char v[] = "American";
char *p = v;
strlen(p);
strlen(v);
cout << "p of length: " << strlen(p) << endl;
cout << "v of length: " << strlen(v) << endl;
}
7.3.1 数组漫游
//数组访问
void f_a()
{
char v[] = "Witness";
for (int i = 0; v[i] != 0; ++i)
cout << v[i] << " ";
}
//指针访问
void f_p()
{
char v[] = "Witness";
for (char *p = v; *p != 0; ++p)
cout << *p << " " ;
}
void f_c()
{
int v1[10] = {11,2,3,6,8,0,2};
int v2[10] = { 7,2,13,62,58,100,21 };
int *p1 = v2 + 2;
int *p2 = v2 + 1;
int *p2 = v2 - 1; //无法访问
cout << *p1 << " ";
cout << *p2 << " ";
}
7.4 指针与const
const:在当前作用域中,值不会发生改变。因为我们无法给const对象赋值,所以它必须初始化。
const int model=90; //model是一个const;
const int v[]={1,2,3,4}; //v[i]是一个const;
const int x ; //缺少初始化器;
//错误,声明成const,其值就无法在作用域改变。
void f()
{
modle=200;
v[2]=3;
}
指针常量与常量指针:指针一般涉及两个对象,指针本身和指针所指向的对象,前置const将所指对象成为常量,而*const将指针本身成为常量。
void f_p_const()
{
char s[]="SEVEN";
//指针常量;
const char* pc=s;
pc[3]='H'; //无法修改,指向常量;
pc=p; //OK;
//常量指针;
char *const cp=s;
cp[3]='A';
cp=p; //错误;
//无法修改
const char *const cpc = s;
}
const char *p; // 声明一个指向字符或字符串常量的指针(p所指向的内容不可修改)
char const *p;// 同上
char * const p;//声明一个指向字符或字符串的指针常量,即不可以修改p的值,也就是地
址无法修改。
7.5 引用
引用所引的永远是一开始初始化的那个对象,不能指向其他对象;不存在空引用的情况。
左值引用:引用我们希望改变的值;
const引用:引用不希望改变的值,如常量;
右值引用:引用之后无须保留,比如临时变量;
7.5.1 左值引用
符号X&的意思是X的引用;常表示与左值引用。
void f()
{
int var=1;
int &r {var}; //r和var对应同一个int;
int x=r; //x的值变为1;
r=2; //var的值变为2;
}
为了确保引用对应某个对象,必须初始化引用。
7.5.2 右值引用
声明符&&表示右值引用。