二级指针的使用详解

欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46629065

一、概念

在如下的A指向B、B指向C的指向关系中:

首先

C是"一段内容",比如你用malloc或者new分配了一块内存,然后塞进去"一段内容",那就是C了。C的起始地址是0x00000008。

B是一个指针变量,其中存放着C的地址,但是B也要占空间的啊,所以B也有地址,B的起始地址是0x00000004,但是B内存中存放的是C的地址,所以B里面的内容就是0x00000008。

那么到此为止都比较好理解:

B= 0x00000008;  //B的内容
*B = "一段内容";  //B解引用,也就是B指针指向的C的值
&B = 0x00000004;  //B取地址,B的地址是0x00000004

那么,再来看A:

A是二级指针变量,其中存放着B的地址0x00000004,A也有地址,是0x00000000;

*A = B= 0x00000008;  //A解引用也就是B的内容
**A = *B = "一段内容";  //B解引用,也就是B指针指向的C的值
A = &B = 0x00000004;  //A存的是B的地址,B的地址是0x00000004
&A = 0x00000000;  //A取地址

二、使用

有两个变量a,b,指针q,q指向a,我们想让q指向b,在函数里面实现。

1.先看看一级指针的实现

#include<iostream>

using namespace std;

int a= 10;
int b = 100;
int *q;

void func(int *p)
{
	cout<<"func:&p="<<&p<<",p="<<p<<endl;  //note:3
	p = &b;
	cout<<"func:&p="<<&p<<",p="<<p<<endl;  //note:4
}

int main()
{
	cout<<"&a="<<&a<<",&b="<<&b<<",&q="<<&q<<endl;  //note:1
	q = &a;
	cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;  //note:2
	func(q);
	cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;  //note:5

	system("pause");
	return 0;
}

这么写有什么问题?为什么*q不等于100?我们看一下输出便知:

&a=0032F000,&b=0032F004,&q=0032F228

*q=10,q=0032F000,&q=0032F228

func:&p=0018FD24,p=0032F000

func:&p=0018FD24,p=0032F004

*q=10,q=0032F000,&q=0032F228

我们看输出:

note:1->a,b,q都有一个地址.

note:2->q指向a.

note:3->我们发现参数p的地址变了,跟q不一样了,是的参数传递是制作了一个副本,也就是p和q不是同一个指针,但是指向的地址0x0032F000(a的地址)还是不变的.

note:4->p重新指向b.

note:5->退出函数,p的修改并不会对q造成影响。

结论:

编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫未变。

2.二级指针操作

#include<iostream>

using namespace std;

int a= 10;
int b = 100;
int *q;

void func(int **p)
{
	cout<<"func:&p="<<&p<<",p="<<p<<endl;
	*p = &b;
	cout<<"func:&p="<<&p<<",p="<<p<<endl;
}

int main()
{
	cout<<"&a="<<&a<<",&b="<<&b<<",&q="<<&q<<endl;
	q = &a;
	cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;
	func(&q);
	cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;

	system("pause");
	return 0;
}

这样q就能正常等于b了。

因为传了指针q的地址(二级指针**p)到函数,所以二级指针拷贝(拷贝的是p),但是它还是指向一级指针q(*p = q)。在这里无论拷贝多少次,它依然指向q,那么*p = &b;自然的就是 p = &b;了。

3.再看一个例子:

void  my_malloc(char **s)
{
	*s=(char*)malloc(100);
}  

void  main()
{
	char  *p=NULL;
	my_malloc(&p);
	//do something
	if(p)
		free(p);
}  

这里给指针p分配内存,do something,然后free(p),如果用一级指针,那么就相当于给一个p的拷贝s分配内存,p依然没分配内存,用二级指针之后,才对p分配了内存。

时间: 2024-08-05 10:55:18

二级指针的使用详解的相关文章

c++的引用与指针的关系详解

[TOC]#1.引用的概念及用法概念:引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.     温馨提示:引用不是定义一个新的变量定义的格式为:    类型 &引用变量名 = 已定义过的变量名;用法:举个例子: int a = 5; int& b = a; 这就是引用,b引用a,b是a的别名. #2.引用做参数我们在C语言中经常用指针做参数: Func(int *a) ; int main() { int arr[1000]; Func(arr); } 像这种情况

C++ 指针函数的详解

1.函数指针 (1)一般来说函数通常包括一系列指令,通过编译后,在内存中占据了一块存储空间. 它有一个起始地址,这个起始(入口)地址就称为函数的指针. (2)主函数在调用子函数时,就是让程序转移到函数的入口地址开始执行. (3)我们可以定义一个指针变量用来指向函数,然后通过使用该指针变量调用此函数. 指向函数的指针:就是能够存放某个函数入口地址的指针变量. 总结了一下,函数指针有两个用途:一个是调用函数,另一个是做函数的参数 函数指针定义的一般形式: 数据类型     (*指针变量名)(参数表)

C函数类型和函数指针使用方法详解

二.通常的函数调用 一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main(int argc, char* argv[]) {    MyFun(10); /* 这里是调用MyFun(10) 函数 */    return(0); } void MyFun(int x) /* 这里定义一个MyFun函数 */ {    printf("%d\n",x); } 这个My

C++中this指针的用法详解

转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数.也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行.

C++中this指针的用法详解(转)

原文地址:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数.也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进

20160206.CCPP体系详解(0016天)

代码片段(01):.指针.c+02.间接赋值.c 内容概要:内存 ///01.指针 #include <stdio.h> #include <stdlib.h> //01.取地址操作符(&)详解: // 1.操作对象:变量名(实质:内存实体|数据实体) // 2.操作特点:属于寄存器操作(操作结果不是内存实体) // (1).取地址操作(&变量名)是在CPU的寄存器区域所完成的操作; // (2).地址数据不占用内存,内存地址是在CPU核心构成组件寄存器产生的, /

C++内存分配秘籍—new,malloc,GlobalAlloc详解

C++内存分配秘籍-new,malloc,GlobalAlloc详解                                                   _______只为因内存分配而无法入眠的程序员 一.关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在 .例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

二级指针详解

二级指针:也叫双指针,指针的指针用作参数,大多用在需 要函数改变该指针的指向时 代码目的是setPeople方法执行后,people指针指向了一个新 创建的people对象. 一级指针 log输出如下: 概述: people为一个指针,可以直接使用这个指针所储存的内存地 址,又可以使用这个地址里储存的值. 指针是一种数据类型,与其它的数据类型不同的是指针是一 种“用来存放地址值”的变量 %p 一般以十六进制整数方式输出指针的值 &取地址符号:&后面跟变量标识符即可获得变量的内存地址 指针虽