重学C++ (二) 数组和指针

第四章 数组和指针

1.数组的维数必须用值大于等于1的常量表达式定义,非const常量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数;

2.注意下面两种初始化的区别:

char c1[] = {'C', '+', '+'}; //末尾没有null,3维
char c2[] = "C++"; //末尾有null,4维;
char c3[3] = "C++"; //error

3.数组下标的正确类型是size_t;

4.指针变量的定义:

int *p1; //风格1
int* p2; //风格2
int *p3, *p4; //good
int* p3, p4; //bad,p3是指针,p4是int类型
int* p3, *p4; //ok,但易出错

建议采用风格:*紧贴指针变量名放置;

5.指针类型void* , 它可以保存任何类型对象的地址;
void*指针只支持几种有限的操作:
与另一个指针进行比较;
向函数传递void*指针或从函数返回void*指针;
给另一个void*指针赋值;

*不允许使用void指针操纵它所指向的对象;

6.指针与引用的比较:

引用总是指向某个对象,需要初始化(即不能为空),而且初始化后无法改变;

给引用赋值修改的是所关联的对象的值,而不是使引用与另一个对象关联;

指针是一个实体,分配内存;引用是一个别名,不分配内存;

7.指针和const:

const double *cptr; //指向const对象的指针;

不能把const对象的地址赋给非const对象的指针;
允许把非const对象的地址赋给指向const对象的指针;

**该指针所指对象的值是不能通过该指针来修改的(这么说是因为,可能该指针指向一个非const对象,该对象可以通过其他途径进行修改);而指针本身是可以修改的;

而对于const指针,指针本身是不可以修改的,故它必须在定义时进行初始化:

int num = 0;
int * const curnum = #

8.指针和typedef:

typedef string *pstring;
const pstring cstr;

以上语句应该等价于:

string * const cstr;
//或者:
typedef string *pstring;
pstring const cstr;

const修饰的是pstring,即cstr是指向string类型的const指针;

9.应用strn函数处理C风格字符串,它们比str函数更安全,因为可以控制字符的个数;

10.动态数组:

size_t n = get_size();
int *p = new int[n];
for (int *q = p; q != p+n; ++q)
    ……
delete [] p;

11.混合使用string和C风格字符串:

string st("Hello");
char *str = st.c_str(); //almost ok,but not quite
char *str = st; //error
const char * str = st.c_str(); //ok

12.typedef简化指向多维数组的指针:

int ia[3][4];
typedef int int_array[4];
int_array *ip = ia;

int_array是一个指向int[4]的指针;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值