最近翻看晴神的《算法笔记》。补充一点遗漏的内容。
7)
#include <iostream> using namespace std; int main() { int a[10] = { 1,4,9,16,25,36,49 }; int* p = a; int* q = &a[5]; printf("q = %d\n", q); printf("p = %d\n", p); printf("q - p = %d\n", q-p); return 0; }

地址相减本应该为20(Byte),但结果是5,因为q-p是以int为单位,两个int型的指针相减,等价于求两个指针之间相差了几个int(4Byte)的距离。
到此为书上的举例,但是再细想,如果不是整形数组而是string数组呢?修改代码如下:
#include <iostream> #include<string.h> using namespace std; int main() { string a[4] = { "a","b","c","d" }; string* p = a; string* q = &a[3]; printf("q = %d\n", q); printf("p = %d\n", p); printf("q - p = %d\n", q-p); return 0; }

可见两个地址之间差了84。而且可以注意,即便将 a中a[1]的”b”转换为”bbbbbbb”(也就是改变他的长度),地址之间的值还是相差84。也就是字符串数组中每一个相邻的单位都占用了28Byte。对任意一个string类型的实例化对象使用sizeof()也是28Byte。
那为什么是28Byte?
string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,因为其在栈中的占用内存是固定的,而字符串所占的空间是从堆中动态分配的。
8) swap操作的理解
#include <iostream> using namespace std; void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 1, b = 2; int* p1 = &a, * p2 = &b; swap(p1, p2); return 0; }
