C++基础回顾(二)

最近翻看晴神的《算法笔记》。补充一点遗漏的内容。

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;
}
通过单项一次性值传递获得的地址直接对地址内内容进行操作