指针
指针,本质上是保存其他变量地址的变量。
当我们创建变量时,背后发生的事情是内存分配。比如,为一个int类型的变量预留4个字节的内存空间,它有自己的存储段和一个地址,地址就是计算机来定位这4个字节的,当计算机读取到之后向用户现实数据读取的内容。
每个字节段都有自己的地址,通常该地址被视为该段中的第一个字节的位置。
为什么要使用地址
调用函数,把一个结构体作为输入参数时,首先复制这个结构体来初始化输入参数,即为该函数创建的占位符。该结构体的每个元素(变量、函数)都会一一复制到临时局部结构体中。如果结构体非常大,就会创建很大的临时空间,在内存中传递时效率很低。
传递地址时,只传递一个代表地址的数字,告诉别人那个需要的结构体在哪里,然后直接访问那块内存。
指针的创建和初始化
int* ptr;
int*是一个指向int的指针,而不是int类型。
指针不需要在声明时初始化。需要给他一个变量的地址来初始化它。
int myInt = 2;
ptr = &myInt;
&作为引用时,引用对应对象的的内存位置。而作为取地址运算符时,是获取引用的变量的地址然后赋值给指针。
使用指针
Ptr本身存储的内容是地址,使用*解引用,得到地址内存储的值。
int main()
{
int a = 100;
int* aPtr;
aPtr = &a;
cout << aPtr << endl;
cout << *aPtr << endl;
}
改变指针的值
int b = 50;
aPtr = &b;
cout << aPtr << endl;
cout << *aPtr << endl;
数组指针
int numbers[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//保存数组中第一个元素的地址
int* NumPtr = numbers;
cout << *NumPtr << endl;
指针的运算
指针可以使用加减运算符。
在数组中,自增就是移动到数组下一个元素的地址。
数组指针声明时的类型值必须和数组中元素的类型一样。
int numbers[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *NumPtr = numbers;
NumPtr++;
cout << *NumPtr << endl;
NumPtr += 3;
cout << *NumPtr << endl;
结构体指针
struct Container
{
string name;
int X;
int Y;
int Z;
};
int main()
{
Container container = {"yuyu", 5, 6, 7};
Container* ptrToContainer = &container;
}
- 访问结构体指针
cout << (*ptrToContainer).name << endl;
先解引用,再用.访问
语法糖把看起来很难看的东西,变成另一种好看一些的形式。。
cout << ptrToContainer->name << endl;