数组
当我们只是定义了数组,而没有对数组进行初始化时,那数组的值将是未定义的。
在对数组进行初始化时,如果只对数组的一部分进行初始化,编译器会将把其他元素自动设置为0。
#include <iostream>
using namespace std;
int main()
{
int nums1[3] = { 0 };
cout << nums1[0] << " " << nums1[1] << " " << nums1[2] << endl;
int nums2[3];
cout << nums2[0] << " " << nums2[1] << " " << nums2[2] << endl;
return 0;
}
输出:
0 0 0
57 0 2037520
字符串
只有以空字符(\0)结尾的char数组才是字符串,这是因为C或C++在处理字符串时是以空字符作为结束标识的。
当初始化一个数组未指定长度时,编译器会对自动计算长度,通常这是一种很糟的做法,但是这种做法对于字符数组初始化为一个字符串的情况下是更安全的,因为字符串常量会隐式地包含结尾符。
#include <iostream>
using namespace std;
int main()
{
char dog[5] = {'b','e','a','u','x'};
char cat[5] = {'b','e','a','u','\0'};
cout << dog << endl;
cout << cat << endl;
// char bird[5] = "birds"; //编译报错。"birds"实际长度为6,即默认结尾会含\0
char fish[] = "fishs";
cout << fish << endl;
return 0;
}
输出:
beaux�u
beau
fishs
结构
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。C 语言提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。
C++也允许指定占用特定位数的结构成员,字段的类型应为整型或枚举,且有以下限制:
- 一个位域必须存储在同一个字节中,不能跨两个字节。
- 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度。
- 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
#include <iostream>
using namespace std;
struct bitTest {
unsigned int SN: 4;
unsigned int: 4; //4 bit unused
bool b1: 1;
bool b2: 1;
};
int main()
{
bitTest bt = { 14, true, false };
// 结构体会以最大长度对齐,即 SN+填充 占4字节,b1+b2 占4字节
cout << sizeof(bt) << endl; // 输出:8
return 0;
}
指针
C++允许将指针和整数相加,加1的结果等于原来的地址值加上指向的对象占用的字节数。
#include <iostream>
using namespace std;
int main()
{
int nums[3] = { 1, 2, 3 };
int* np = nums;
cout << "np=" << np << ", nums=" << nums << ", &nums[0]=" << &nums[0] << endl;
cout << "np+1=" << ++np << ", value=" << *np << endl;
return 0;
}
输出:
np=0x61fe0c, nums=0x61fe0c, &nums[0]=0x61fe0c
np+1=0x61fe10, value=2