地址与内存关系
计算机的内存看作是一排很长很长的房子,每个房子都可以放数据,通过一个房号来标识。这个比喻颇为有用,也存在局阻性。计算机的内存由数以亿万计的位(bit)组成,每个位可以容纳值0或1.由于一个位所能表示的值的范出太有限,所单独的位用处不大,通常许多位合成一组作为一个单位(比如最小8位,char类型),这样就可以存储范围较大的值。画个图来描述机器中的内存位置。
计算机的内存看作是一排很长很长的房子,每个房子都可以放数据,通过一个房号来标识。这个比喻颇为有用,也存在局阻性。计算机的内存由数以亿万计的位(bit)组成,每个位可以容纳值0或1.由于一个位所能表示的值的范出太有限,所单独的位用处不大,通常许多位合成一组作为一个单位(比如最小8位,char类型),这样就可以存储范围较大的值。画个图来描述机器中的内存位置。
为什么指会要定义类型?这个问题是一个值得思考的问题。我们在写c/c++程式的时候都知道,定义每个变量都要告诉编译器类型,这种就是强类型语言。比如
两个指针一个指向数组的头部,另一个指向数组的尾部。求数组中间位置?
这个用指针的算术运算就可以完成,用尾部指针减去头部指针,再除以2就可以。不过有一点要注意数组要是奇数才有中间位置,例如:1 2 3 4 5 6 7 中间是4。
判断奇数可以用求余 %方式
使一个成员为private或protected的原因是想限制对它的访问,对吗?劳累的编译器要费九牛二虎之力来确保你设置的访问限制不被破坏,对不对?所以,写个函数来让用户随意地访问受限的成员没多大意义,对不对?如果你确实认为有意义,那么请反复阅读本段,直到你不这样认为为止。
答案是,0是一个int——准确地说,一个字面上的整数常量——所以,“总是”f(int)被调用。这就是问题所在:因为不是所有的人总是希望它这样执行。这是c++世界中特有的一种情况:当人们认为某个调用应该具有多义性时,编译器却不这么干。
指针的指针做输入参数代替二维数组?
有时在写程序是会碰到定义函数输入参数要一个二维数组,但并不能确定数组内的元素个数时,这种情况可以用指针的指针做输入参数解决问题。
因为不用指针的指针,二维数组做对也只能有一维定义时不给出元素个数 (int a[][3])。
指针的指针做输入参数好处就是,不用在定义时就要知道组内元素个数,可以在调用时输入,这们定义的函数更通用。
数组在内存中就指一段连续的内存,但C++提供了一种快捷表示,定义数组名可以等价于该数组的首地址。
int a[5] = {0}; 定义整型数组,获取首地址可以有两个写法了,取址符:&a[0], 数组名: a
指针就是指向某个数据的地址,当然也可以指向数组的首地址,
这取决于你到底想达到什么目的:
如果你想改变被传递的对象,那就按引用传递或者使用指针;例如 void f(X&); 或者 void f(X*);
如果你并不想改变被传递的对象,但该对象很大,那就按常量引用传递;例如 void f(const X&);
因为机器的不同以及 C 里面也有很多未定义的东西。ISO C++ 标准里有以下术语的详细定义:“未定义”、“未指明(unspecified)”、“由实现定义”,以及“合乎语法的(well-formed)”。注意,这些术语的含义和 ISO C 标准里的定义不太相同,而且也和它们常见的用法不同。假若没有察觉到不同的人对这些术语的认识会有所偏差,讨论问题的时候常常会极度混乱。
C++ 里,NULL 的定义就是 0,所以到底使用哪个只是个审美问题。我个人倾向于避免使用宏,所以我使用 0。还有个问题是,有些人误以为 NULL 和 0 并不相同,并且/或者以为 NULL 不是整数。在标准前的代码里,NULL 有时被定义成不恰当的东西,因此不得不避免使用它。不过现今这已不常见。如果你必须给空指针起个名字,那就叫它 nullptr;C++0x 中将会这么叫。届时,“nullptr”将会是个关键字。