数组和指针
指针变量储存的是变量的内存地址,
数组的地址就是数组所占据内存空间的第一块数据的地址,而数组的值是由数组所有元素的值构成,打印数组的时候会输出数组的第一个数据的指针, 可以说和指针有点联系, 但 数组 != 指针,
int a[5] = {10};
int *p = a;
std::cout << sizeof(a) << " " << sizeof(p) << std::endl;
std::cout << typeid(p).name() << " " << typeid(a).name() << std::endl;
//输出
// 20 8
// Pi A5_i
可以通过typeid 和 大小可以看到,指针就是指针,数组就是数组
指针运算
指针也是可以进行位移运算的,例如,,有一个指针变量指向另一个数组变量中的的第一个元素的内存地址, 这样就可以通过指针的位移运算获取该数组的其他位置的元素了, 如:
int a []{10, 20, 30};
int *p = a; // 获取到的是数组的第一个元素的内存地址
std::cout << "数组a的第一个元素是 " << *(p+0) << std::endl;
std::cout << "数组a的第二个元素是 " << *(p+1) << std::endl;
std::cout << "数组a的第三个元素是 " << *(p+2) << std::endl;
// 输出
// 数组a的第一个元素是 10 偏移后的指针地址是: 0x61fd60
// 数组a的第二个元素是 20 偏移后的指针地址是: 0x61fd64
// 数组a的第三个元素是 30 偏移后的指针地址是: 0x61fd68
可以看到,指针也是可以进行运算的,通过指针变量加1可以获取数组的下一位指针,然后解引用获取到指针的内容, 注意, 指针加1是指针类型的内存地址偏移, 如, 当前指针是int 类型的,所以它加1就会偏移 4 个字节, 得到新的内存地址, 而不少单纯的数字加一
double b [] {10, 20, 30};
double *p1 = b;
std::cout << p1 << std::endl;
std::cout << "数组b的第一个元素是 " << *(p1+0) << " 偏移后的指针地址是: " << p1 + 0<< std::endl;
std::cout << "数组b的第二个元素是 " << *(p1+1) << " 偏移后的指针地址是: " << p1 + 1<< std::endl;
std::cout << "数组b的第三个元素是 " << *(p1+2) << " 偏移后的指针地址是: " << p1 + 2<< std::endl;
// 输出
// 数组b的第一个元素是 10 偏移后的指针地址是: 0x61fd40
// 数组b的第二个元素是 20 偏移后的指针地址是: 0x61fd48
// 数组b的第三个元素是 30 偏移后的指针地址是: 0x61fd50
可以看到,指针运算是以类型的大小来进行运算的, int 4 个字节, double 8 个字节
指针可以进行++ – 操作
结构体
在架构体中可以存储不同类型的数据,比数组,vector 这种只能储存相同类型的容器灵活多了,结构体通过 static 来进行 声明,
struct stu{
int age;
string name;
};
在 stu 结构体中可以存储不同类型的数据, 当获取数据额时候通过 结构体.属性 就可以获取到结构体中储存的数据了,
struct stu{
int age;
string name;
};
stu stus;
stus.name = "laoluo";
stus.age = 20;
std:: cout << stus.age << std::endl;