本文是深蓝学院c++课程的个人笔记和感悟,仅供学习参考。
int b[3]
int b[x]
,原则上是不可以的。#include
int b[3];
int main() {
int a[3];
std::cout << a[0] << std::endl;
std::cout << b[0] << std::endl;
return 0;
}
---result----
a[0]: 21919 (random)
b[0]: 0
int a[3] = {1,2}
。那么a[3]自动初始化为0auto a = {1,2,3}
中a的类型其实是std::initializer_list[3]
c++不支持数组直接复制:
int a[] = {1,2,3}
int b = a; // X,错误!
问:为神马c++不支持数组的复制呢?
答:因为c++是一种注重性能的语言,复制得开辟好多空间喔~
char str[] = "hello" // char[6]
char str[] = "h", "e", "l", "l", "o" // char[5]
神奇!为神马第二种方式的str变量变成char[5],而第一个是char[6]呢?
原因: c/c++会在第一种初始化的字符串后面“偷偷地”加一个'\0'
字符,用来判断字符串的结束。
int* data[3] = {&x1, &x2, &x3}; //data是一个包含三个int*指针的数组
int (*data)[3] = {x1, x2, x3}; //data是一个int[3]数组的指针
int (&data)[3] = {x1, x2, x3}
数组对象是一个左值
a[1]其实等于1[a]: *((1)+(a))
内存访问越界
,但是非常非常危险,因为会访问到越界的那个地址上的数据,而不会像python给你报错。auto
,是会发生隐式转换的。本来右边是个数组,auto
之后就变成指针了。因为a[1] = *((1)+(a))
,数组其实也是需要基于地址的访问。extern int array[]
用extern的时候一定不能用指针哈,不然会把array前8个字节的数据(而且根据高位低位的规则,后4位放在前面)当成指针指向的地址… 完全跑飞了std::cbegin(array)
std::cend(array)
这里的c是指const
,防止不小心更内容。sizeof(array) / sizeof(int)
std::size()
std::cbegin()
and std::cend()
但对于std::vector来说,sizeof(vector)
只能返回一个固定值24(根据编译器而定)。因为std::vector通常由三个8 byte的Pointer(指针)组成:
for(int i; i
auto ptr = std::cbegin(a)
while(ptr != std::cend(a))
{
ptr = ptr + 1;
}
for(int x: a){
std::cout << x << std::endl;
}
c字符串用strlen可以求出长度,但是一定要注意,在单个定义字符串的字符时,最后结尾要加一个\0
来结尾。不然其实程序是pointer一直在内存里面找下一个字符,直到找到\0
才会截止。
include <cstring>
char str1[] = "Hello";
char str2[] = ['H', 'e', 'l', 'l', 'o', '\0'];
auto ptr = str1;
std::cout << strlen(str1) << std::endl;
std::cout << strlen(str2) << std::endl;
std::cout << strlen(ptr) << std::endl;
//一重大括号 vs 多重大括号
int x2[3][4] = {1,2,3,4,5,6};
int x2[3][4] = {{1,2,3,4}, {5,6}};
// (int, int, int, int), (int, int, int, int), (int, int, int, int)
// 自动补0
int x3[][3] = {1,2,3,4}
// 系统会直接给补全,初始化为X3[2][3]
int x4[][4] = {{1,2,3}, {5,6,7,8}}
// 自动会把第一排最后一个补0,{1,2,3,0}
相比之下,内建数组更加注重性能。
std::vector<int> a(3,1); //3个元素,每一个的数值都是1
std::vector<int> a{3,1};
std::vector<int> a = {1,2,3,4};
// {1,2,3} 表示一个std::initializer_list 初始化列表
std::vector<int> x1;
// Vector的基本方法
x1.size()
x1.empty()
x1.push_back(val)
x1.pop_back()
// Vector的比较
x1 == x2
x1 < x2 // Vector的比较是按照priority来:
// 先看第一位是不是相同,如果不同,那直接就用第一位的结果作为最终大小比较的结果啦!
// Vector中元素的遍历
x1[index]
x1.at(index) // 建议使用vec.at(idx),因为这样如果idx>size,系统会报错。
// 指针访问Vector
std::vector<int>* ptr = &x1;
// 指针访问Vector所包含的Method: -> 以及 .
(*ptr).size()
ptr->size()
int a[3][4];
//Array的a[0]和a[1]的维度都是一样的
std::vector<std::vector<int>> vec = {{1,2,3}, {4,5}};
//Vector可以不同维度的元素长度是可以不一样的
std::string x("Hello String");
std::string y("Hello");
y = y + "Wei";
//std::string是可以支持拼接的,但是内建字符串char[]是不能拼接的。