聊一下关于C语言多级指针的问题

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;
}

解释:

扫描二维码关注公众号,回复: 2479682 查看本文章

首先,我们定义了两个整形的变量。然后又分别的定义了一级指针,二级指针, 三级指针。

然后,要知道如果要保存类型为X(这里的X我假定是要定义的变量的类型)的变量时,就要在X的前面加一个*。分别给指针赋值。

输出结果分析:

p是一个指向0级指针(int)的变量。“20379484, 10”第一个数据是这个指针本身的地址,第二个数据是通过*(一级解引用)找到的内存空间的值。

pp是一个指向1级指针(int*)的变量。“20379460, 20379484, 10”第一个数据是这个指针本身的值,第二个数据是通过*(一级解引用)找到的pp指向的内存空间保存的地址。第三个数据是通过**(二级解引用)找到的类型为(int)的值。

最后,总结下规律:

	int ***ppp;
	*ppp//一级解引用,类型是int**
	**ppp//二级解引用,类型是int*
	***ppp//三级解引用,类型是int

猜你喜欢

转载自blog.csdn.net/qq_18152813/article/details/81225683