重学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]的指针;
相关文章推荐
- 【C语言】推断一个数的奇偶(位操作)
- C++ 虚函数表解析
- C++值初始化,默认初始化,以及其他初始化类型
- C语言学习之预编译第一讲
- Effective C++(条款32-34)
- C++函数重载和函数覆盖的区别
- c++ template 学习之一:模板参数
- VS2008非托管c++访问webservice服务
- c++11线程sleep
- 1、一日一程序之C语言的Hanoi问题
- C++ 类型系统
- C语言 常量、变量
- c++的函数的重载原理分析和调用约定
- C语言-十进制转二进输出
- 《C语言及程序设计初步》第33讲实践项目
- C++11多线程简单示例
- C++读取name values形式Config 配置文件
- 用C语言打印杨辉三角
- C++基础题目
- QML与C++交互