C++指针、数组和引用

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 右值引用
声明符&&表示右值引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值