C语言中的指针,是C语言的灵魂。也是C语言的难点!无数小白被指针摧残。。。
那么指针到底是个啥??在这里聊聊我对指针的理解:
我们先来看一段代码
这里我引用郝斌老师的一段代码:
# include <stdio.h>
int main(void)
{
int * p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址
//int * p; 不表示定义了一个名字叫做*p的变量
// int * p; 应该这样理解: p是变量名, p变量的数据类型是 int *类型
// 所谓int * 类型 实际就是存放int变量地址的类型
int i = 3;
int j;
p = &i;
/*
1. p保存了i的地址, 因此p指向i
2. p不是i,i也不是p,更准确的说: 修改p的值不影响i的值,修改i的值也不会影响p的值
3. 如果一个指针变量指向了某个普通变量, 则
*指针变量 就完全等同于 普通变量
例子:
如果p是个指针变量,并且p存放了普通变量i的地址
则p指向了普通变量i
*p 就完全等同于 i
或者说: 在所有出现*p的地方都可以替换成i
在所有出现i的地方都可以替换成*p
*p 就是以p的内容为地址的变量
*/
j = *p; //等价于 j = i;
printf("i = %d, j = %d\n", i, j);
return 0;
}
郝斌老师说过:
指针就是地址,地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样
相信看完郝斌老师的讲解你应该对一级指针有了一定的了解。
那么下面我们步入正题,说一下多级指针的问题。
还是先来看一段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int a = 10;
int b = 20;
int *p;
int **pp;
int ***ppp;
//一级指针
p = &a;
printf("%d, %d\n", p, *p);
//二级指针
pp = &p;
printf("%d, %d, %d\n", pp, *pp, **pp);
//三级指针
ppp = &pp;
printf("%d, %d, %d, %d\n", ppp, *ppp, **ppp, ***ppp);
/*
运行结果
20379484, 10
20379460, 20379484, 10
20379448, 20379460, 20379484, 10
请按任意键继续. . .
*/
printf("\n");
system("pause");
return 0;
}
解释:
首先,我们定义了两个整形的变量。然后又分别的定义了一级指针,二级指针, 三级指针。
然后,要知道如果要保存类型为X(这里的X我假定是要定义的变量的类型)的变量时,就要在X的前面加一个*。分别给指针赋值。
输出结果分析:
p是一个指向0级指针(int)的变量。“20379484, 10”第一个数据是这个指针本身的地址,第二个数据是通过*(一级解引用)找到的内存空间的值。
pp是一个指向1级指针(int*)的变量。“20379460, 20379484, 10”第一个数据是这个指针本身的值,第二个数据是通过*(一级解引用)找到的pp指向的内存空间保存的地址。第三个数据是通过**(二级解引用)找到的类型为(int)的值。
最后,总结下规律:
int ***ppp;
*ppp//一级解引用,类型是int**
**ppp//二级解引用,类型是int*
***ppp//三级解引用,类型是int