指针的含义、表示、规范、存储、运用

发布时间 2024-01-10 20:00:22作者: 吃不了就兜着走

# 指针的含义
表示某个变量或数据所在的内存地址 注意是内存地址 不是内存地址上的数据
# 指针的表示
一般用指针运算符&和 *表示 其中符号&表示取地址运算符 符号*表示取地址上数据运算符 例如:&value 表示取变量value在内存中分配的地址 *value 表示取变量value在内存中所分配地址上的数据
# 指针的规范
## 先声明再定义
```cpp
int *p;//这里是声明一个整数型指针变量p 注意int *p虽然是连着一起写 实则是int* p 其中p是变量名 int*是数据类型 且是整数型指针数据类型
p = &a;//这里是定义一个整数型指针变量p 而指针就是表示某个变量或数据的内存地址 进一步可知&a就是取变量a在内存中分配的地址赋给整数型指针变量p
printf("p = %d\n",p);//打印出整数型指针变量p等于地址6000001
```
## 声明和定义一起表示
```c
int *p = &a;//取变量a在内存中分配的地址赋给整数型指针变量p
printf("p = %d\n",p);//打印出整数型指针变量p等于地址6000001
```
## 错误表示
```c
int a = 2;//把十进制数2赋给整数变量a
int *p = a;//这里是错误的表达方式 不能把一个具体的数据赋给指针
```
# 指针的存储
## 理解一个变量的存储过程和原理
```c
int a = 5;
printf("a = %d",a);
```
解释以上:在栈中定义了一个变量a,并且在内存中开辟了一个int类型大小的空间, 即4个字节空间 ,然后让变量a指向这片空间,在变量a所在那片空间,里面存放数值5 ,把数值5转换成二进制数,存到变量a的4个字节空间,如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cf081d04315d46fe8f30094b806d9836.webp)
## 理解一个指针的存储过程和原理
```c
int a = 5;
int *p;//这里是声明一个整数型指针变量p 注意int *p虽然是连着一起写 实则是int* p 其中p是变量名 int*是数据类型 且是整数型指针数据类型
p = &a;//这里是定义一个整数型指针变量p 而指针就是表示某个变量或数据的内存地址 进一步可知&a就是取变量a在内存中分配的地址赋给整数型指针变量p
printf("p = %d\n",p);//打印出整数型指针变量p等于地址6000001
```
解释以上:在栈中定义了一个变量a,并且在内存中开辟了一个int类型大小的空间, 即4个字节空间 ,然后让变量a指向这片空间,在变量a所在那片空间,里面存放数值5 ,把数值5转换成二进制数,存到变量a的4个字节空间,另外在栈中再定义一个指针变量p,且在内存中开辟了一个int*类型大小的空间,即4个字节空间 ,最后从变量a的内存空间取出变量a所在内存地址,存放到指针变量p开辟的内存地址上,如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/08f87705c7bc4d82a8633f577979f9bd.webp)
## 理解二级指针的存储过程和原理
```c
int a = 5;
int *p;//这里是声明一个整数型指针变量p 注意int *p虽然是连着一起写 实则是int* p 其中p是变量名 int*是数据类型 且是整数型指针数据类型
p = &a;//这里是定义一个整数型指针变量p 而指针就是表示某个变量或数据的内存地址 进一步可知&a就是取变量a在内存中分配的地址赋给整数型指针变量p
int **q;//
q = &p;//
printf("q = %d\n",q);//打印出整数型指针变量q等于指针变量p的内存地址7000001
```
解释以上:先对数据类型和变量划分开,int **q的变量名为q,数据类型为int **,int *中存放的是int类型数据的地址,而int **中存放的是int类型数据的地址的地址,上述我们明白了,一个*是指一个int数值的地址,则指针变量p中存放的是int数值的地址,即p = 6000001,为变量a的地址。那么我们可以推到,指针变量q就是存放指针变量p的地址。指针变量p存放变量a的地址,而指针变量p本身也是一个变量,它的值为变量a的地址 ,而内存也给指针变量p开辟了一片空间,让指针变量p存放它的数值,指针变量q存放指针变量p的地址,指针变量q也是一个变量。
# 指针的运用