C++ Primer Plus 第七章总结
1.不能返回数组,但可以将数组作为结构或对象的组成成分返回。
2.C++将数组名视为指针,视为其第一个元素的地址
e.g
int cookies[size];
cookies == &cookies[0];
int sum_arr(int *arr, int n) //数组作为参数传入
数组表示法( int arr[] ),arr 不仅指向 int ,还指向 int 数组的第一个 int
所以指针作为函数参数时,有两种用法:
①指针指向数组的第一个元素时,使用数组表示法
②指向一个独立的值时,使用指针指示法
3.声明形参(防止数据被修改)使用const(详细见第三章)
4.模块化程序:
自下而上:
组件—>整体 适合OOP (通过数据类型和设计合适的函数)
自上而下:
过程性编程 指定模块化设计方案,再研究细节
5.程序清单7.8中可以使用如下的方法使用数组
int sum_arr(const int *begin , int *end)
{
const int *pt;
...
for(pt = begin; pt != end; pt++){
...
}
}
const int 和 int const 的区别
int age = 39;
const int *pt = &age;
int sage = 80;
pt = &sage;
//只能防止修改pt指向的值,但可以修改pt本身(使其指向其他值)即赋予新地址
//使用const的方式使得无法修改指针的值
int soth = 3;
const int *ps = &soth; //a pointer to const int
int *const finger = &soth; //a const pointer to int
//finger 和 *ps 都是const, 而*finger 和 ps 不是
//const 对象的const 指针
double trouble = 2.0E30;
const double *const stick = &trouble;
//stick 和 *stick 都是cosnt,stick只能指向trouble,而stick 不能用来修改trouble的值
6.指针和const
① int age = 38;
const int *pt = &age; //pt 指向age
pt 指向一个const int ,不能使用pt来修改这个值
*pt 的值为const不能被修改,而age不是const,可以直接通过age变量来修改age
② C++禁止const的地址赋给非const的指针;
e.g.
const float g_earth = 9.8;
const float *pe = &g_earth; //合法
const float g_moon = 11.3;
float *pm = &g_moom; //非法
③ 指针指向指针
两级间接关系
7.二维数组可以参考P187
arr[M][N];
//M可以省略但是N必须存在,以便编译器确定移动内存的间距(from 《程序员面试白皮书》)
e.g ar2[][4]
//实质:传入仍为指针地址
8.字符串与常规数组之间的一个重要区别是,字符串有内置的结束字符(包含字符,但不以空字符结尾的char只是数组,而不是字符串)(可以使用‘\0’判断字符串是否结束)
9.创建包含n个字符的字符串,需能够存储n+1个字符的空间;
//e.g
char *buildstr(char c, int n)
{
char *pstr = new char[n+1];
pstr[n] = '\0';
while(n-- > 0)
pstr[n] = c;
return pstr;
}
//main
char *ps = buildstr(ch,times);
delete ps;
10.函数也可以返回结构,与数组名第一个元素的地址不同的是,结构名只是结构的名称,要获得结构的地址,必须使用地址操作符 &
(缺点:传入结构过大将增加内存要求)
C++按引用传递
11.传递结构的地址
调用函数是,将结构的地址(&pplace)而不是结构本身(pplace)传递给它;
将形参声明为指向polar(结构体名称)的指针,即 polar* (指针)型。由于函数不应该修改结构,
因此便用const修饰符
由于形参是指针而非结构,因此使用间接成员操作符(->)而非成员操作符(.)
//e.g
void show_polar(const polar *pda)
调用 show_polar(&pplace); //pass address
12.函数指针:函数的地址是存储其机器语言代码的内存的开始地址