龙空技术网

C语言学习篇(19)-----二重指针

嵌入式笔记v 5764

前言:

而今我们对“c语言多重指针”大致比较关注,你们都想要分析一些“c语言多重指针”的相关知识。那么小编也在网摘上网罗了一些对于“c语言多重指针””的相关内容,希望朋友们能喜欢,兄弟们一起来了解一下吧!

引言

在一些复杂的数据类型处理中,以及面试题中往往会出现多重指针的应用,今天我们就来讲讲二重指针的实质和用法。

二重指针的实质

从本质来说,二重指针和我们之前讲的普通(一级)指针都是指针变量,而指针变量的实质还是变量。

从占用内存大小空间来说,一重指针和二重指针,甚至多重指针都是占4个字节内存空间(这里我们以32位系统为例,如果64位系统,则为8字节)。

//以下测试环境:ubuntu64系统#include <stdio.h>int main(void){	char *p1;	//一重指针	char **p2;	//二重指针	char ***p3;	//三重指针		printf("sizeof(p1) = %d.\n", sizeof(p1));	printf("sizeof(p2) = %d.\n", sizeof(p2));	printf("sizeof(p3) = %d.\n", sizeof(p3));		return 0;}

运行结果:

二重指针和一重指针的区别

通过以下例子感受下:

#include <stdio.h>int main(void){	char *p1;	//一重指针	char **p2;	//二重指针	char a;		p1 = &a;	p2 = &a;		return 0;}

编译报警告:

我们可以看到p2和&a类型不兼容,而p1与&a是兼容的。原因:

p2是char **类型, 而&a是char *类型。

char **类型表示指针指向的变量是char *类型

char * 类型表示指针指向的变量是char 类型

我们将上面的p2 = &a代码改成:

p2 = &p1;

再次编译,发现无错误无警告(p1本身是指向char类型指针,再将p1取地址后,就变成了指向char *类型的指针,即二重指针,与p2类型完全一致)。

二重指针的用法

1. 二重指针指向一重指针的地址:

这种用法就是上面例子中p2 = &p1。 这里就不再赘述

二重指针指向指针数组:

#include <stdio.h>int main(void){	int *p1[5];	//指针数组	int **p2;	//二重指针		p2 = p1;		return 0;}

这里我们定义了指针数组p1(如果不清楚数组指针和指针的小伙伴可以参看我前面的文章), 并赋值给二重指针p2,编译发现无错误无警告。

无消息并是最好的消息~

3. 在函数传参时,通过函数内部改变外部的一个指针变量,此时会传这个指针变量的地址(即二重指针)进去。 通过以下例子感受下:

#include <stdio.h>void func(int **p){	*p = (int *)0x12345678;}int main(void){	int a = 4;	int *p = &a;		printf("p = %p.\n", p);		func(&p);		printf("p = %p.\n", p);		return 0;}

分析:

首先我们定义一个指针变量p, 并指向变量a: int *p = &a我们打印下此时p的值: printf("p = %p.\n", p);将p取地址后传入函数func中:func(&p)在函数func()中,我们修改形参中p指向的值(地址)再次打印此时p的指针(地址)

编译运行:

可以看出p的值已经通过函数func()改变了。

思考和总结

二重指针本质上也是指针变量,和普通指针的差别就是它指向的变量类型必须是个一重指针。

C语言中为什么发明各种各样的数据类型,就好比今天介绍的二重指针,没有二重指针在编写代码过程中是否可替代呢? 其实完全是可以的,只是 为了让编译器了解这个指针被定义时定义它的程序员希望这个指针被用来指向什么东西(定义指针时用数据类型来标记,譬如int *p,就表示p要指向int型数据),编译器知道指针类型之后可以帮我们做静态类型检查。编译器的这种静态类型检查可以辅助程序员发现一些隐含性的编程错误,这是C语言给程序员提供的一种编译时的查错机制。

标签: #c语言多重指针 #c语言编程查错 #c语言多重指针的作用