指针
题单介绍
[指针](https://www.luogu.com.cn/blog/zwc/qian-tan-c-zhi-zhen)
指针:
a[5]是数组a里的第5个变量。其中5是他的下标。我们一般用下标来找到一个变量在数组里的位置。
而内存,就可以看成一个很大的一维数组。里面每个变量所在的位置(下标)就被称作地址。
而记录这个地址的变量就被称作指针。
在c语言里面,我们可以用符号&来得到一个变量的地址。用符号*来得到一个地址里的值。
```
int x;//定义一个变量
int *y;//定义一个int类型的指针变量,可以用来存储一个int类型变量的地址
y=&x;//得到x所在的地址,并存到y中
cout<<y;//输出x的地址
cout<<(*y);//输出指针y指向的地址里的值,即x
```
试试下面这段代码
```
int x=1;
int *y,*z;
y=z=&x;
cout<<(*z)<<endl;
(*y)=2;
cout<<(*z)<<endl;
```
由于上面这段代码中,y和z指向的都是x。所有只要改掉y指向的地址里面存的值,那么对应的x就会改变。z指向的值也就变了。
数组与指针:
在我们定义数组时,数组里的所有变量在内存里都是相邻的。
也就是说,定义数组int a[10];那么a[1]的地址其实就是a[0]的地址+4(因为一个int占4个字节)。
在c语言里,数组名字本身其实就相当于一个指针。
也就是说,a其实就是&a[0],a+1其实就是&a[1]。
指针也可以进行加减法(乘除也可以,但是没有太大意义)。
若指针y是指向int类型的指针,值为10。那么y+1的值就为14。若指针y是指向long long类型的指针,值为10。那么y+1的值就为18。char同理,应为11。
指向结构体的指针:
```
定义结构体:
struct node{
int x,y;
};
node a;
node *b=&a;
那么如果想要访问b指向的结构体里x的值,除了可以写成
(*b).x;
还可以更方便的写成
b->x;
```