柔性数组:
struct pack {
int size;unsigned char data[0];
};
int main() {
unsigned char* ptr = new unsigned char[sizeof(pack) + 8];
pack* p = (pack*)ptr;
p->size = 8;
std::memcpy(p->data, "01010101", 8);
}
数组:
char a[10] = "abc";
char a[] = "abc"; // 允许运行时才知道数组大小
void f(char a[]) { std::cout << sizeof(a); } // sizeof(a) = 4,数组不允许直接复制和复制,传值给函数时会退化为指针
数组和指针:
char arr[10] = "abc"; std::cout << sizeof(arr); // sizeof(arr) = 10
char* ptr = "abc"; std::cout << sizeof(ptr); // sizeof(ptr) = 4
数组和指针是不同类型,从sizeof()可以看出,但数组类型类似于一个指向其第一个元素的指针:
std::cout << *a; // 输出a
char* p = arr; // 数组转换为指针
char(&ref)[10] = arr; // 引用
char(*ref)[10] = &arr; // char(*)[10]:指向大小为10的数组的指针
void f(char(*a)[10]) { std::cout << sizeof(*a); } // sizeof(*a) = 10
void f(char(&a)[10]) { std::cout << sizeof(a); } // sizeof(a) = 10