您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-11 10:27 459 查看

第四章 数组和指针

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

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

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


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

4.指针变量的定义:

[code]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:

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


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

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

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

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

[code]int num = 0;
int * const curnum = #


8.指针和typedef:

[code]typedef string *pstring;
const pstring cstr;


以上语句应该等价于:

[code]string * const cstr;
//或者:
typedef string *pstring;
pstring const cstr;


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

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

10.动态数组:

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


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

[code]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简化指向多维数组的指针:

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


int_array是一个指向int[4]的指针;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: