【原创】二级指针中在内存中的样子

长话短说,只要能理解指针,基本上二级指针就很好理解了。

看看下面的栗子:

int a,b; int array[10];

int *pa; pa=&a; //&a 是一个指针表达式。

Int **ptr=&pa; //&pa 也是一个指针表达式。

*ptr=&b; //*ptr 和&b 都是指针表达式。

pa=array; pa++; //这也是指针表达式。

OK。如果你还不理解就调试一下,看看内存中的样子和汇编就明白了。

00BE3C05 89 45 FC             mov         dword ptr [ebp-4],eax
     7: 	int a, b;
     8: 	int array[10];
     9: 	int *pa;
    10: 	pa = &a;//这里也很好理解了。不说了。
00BE3C08 8D 45 F4             lea         eax,[a]
00BE3C0B 89 45 AC             mov         dword ptr [pa],eax
    11: 	int **ptr = &pa;
00BE3C0E 8D 45 AC             lea         eax,[pa]
00BE3C11 89 45 A0             mov         dword ptr [ptr],eax
    12: 	*ptr = &b;//这里可以看出来了吧,它与一级指针不同的地方。这块先赋值了。再取值。再赋值,主要是取出一级指向的地址的值。
00BE3C14 8B 45 A0             mov         eax,dword ptr [ptr]
00BE3C17 8D 4D E8             lea         ecx,[b]
00BE3C1A 89 08                mov         dword ptr [eax],ecx
    13: 	pa = array;
00BE3C1C 8D 45 B8             lea         eax,[array]
00BE3C1F 89 45 AC             mov         dword ptr [pa],eax
    14: 	pa++;
00BE3C22 8B 45 AC             mov         eax,dword ptr [pa]
00BE3C25 83 C0 04             add         eax,4
00BE3C28 89 45 AC             mov         dword ptr [pa],eax
    15:
    16: 	system("pause");
00BE3C2B 8B F4                mov         esi,esp
00BE3C2D 68 58 58 BE 00       push        0BE5858h
00BE3C32 FF 15 14 91 BE 00    call        dword ptr ds:[0BE9114h]
00BE3C38 83 C4 04             add         esp,4
00BE3C3B 3B F4                cmp         esi,esp
00BE3C3D E8 F9 D4 FF FF       call        __RTC_CheckEsp (0BE113Bh)
    17: 	return 0;
00BE3C42 33 C0                xor         eax,eax
    18: }

  

看看监视器中的样子:

这下很好理解了吧。

原文地址:https://www.cnblogs.com/blck/p/8979573.html

时间: 2025-01-10 23:20:32

【原创】二级指针中在内存中的样子的相关文章

OpenCV二维Mat数组(二级指针)在CUDA中的使用

CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二维数组,这样能够省去很多参数,在核函数中可以使用二维数组那样去取数据简化代码结构.当然使用二维数据会增加GPU内存的访问次数,不可避免会影响效率,这个不是今天讨论的重点了. 举两个代码栗子来说明二维数组在CUDA中的使用(亲测可用): 1. 普通二维数组示例: 输入:二维数组A(8行4列) 输出:二

C++二级指针第二种内存模型(二维数组)

C++二级指针第二种内存模型(二维数组) 二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. 定义 类型说明符 数组名[常量表达式][常量表达式] 例如: float a[3][4],b[5][10]; 二维数组元素地址 #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; int a[3][4]={ {1,2,3

(0)c++入门——认识指针与数组——指针即是内存中地址。

初识指针 首先需要了解一个概念,计算机的内存(或者说是寄存器)都是有地址的. <c++ primer plus>一书P37中提到这样一个概念:为把信息存储在计算机中,程序必须记录3个基本属性: 1.信息将要存储在哪里 2.要存储什么值 3.存储何种类型的信息 而正是为了满足第一个属性,开发语言的设计者设计或者说定义了指针:用于描述信息(各种类型的数据如int.float.double等)在内存中的地址(位置).就好比酒店在设计之初也需要制定各个房间的编号是什么,这样更方便安排客户入住.如下图:

python ——变量中计算机内存中的表示

最后,理解变量在计算机内存中的表示也非常重要.当我们写: a = 'ABC' 时,Python解释器干了两件事情: 在内存中创建了一个'ABC'的字符串: 在内存中创建了一个名为a的变量,并把它指向'ABC'. 也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码: a = 'ABC' b = a a = 'XYZ' print b 最后一行打印出变量b的内容到底是'ABC'呢还是'XYZ'?如果从数学意义上理解,就会错误地得出b和a相同,也应该是

二级指针的三钟内存模型

/* Level tow point have three cache model */ #include <stdio.h> #include <stdlib.h> int Print(char**pArr); int Print02(char**pArr,int num); int GetMem(char***thirdModel,int len); int Destory(char***thirdModel,int len); int main() { int i=0; ch

二级指针三种内存模型综合训练

/*** point_practice.c ***/ #include<stdio.h> #include<string.h> #include<stdlib.h> int sort( char **myp1 /*in*/, int num1, char (*myp2)[30], int num2, char ***myp3, int *num3) { int i = 0, j = 0, k = 0; int tmplen; char **p3 = NULL; char

c 二级指针3种内存分配

//#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string> /* *实现二级指针 *author:whish */ ///1.直接分配在栈上 通过char[][]方式 int mainStack() { char array[3][5] ={{'q','w','e','r','b'},{'a','s','d','f','n'},{'z','x','c',

android 中在内存中保存文件

以一个登陆的例子来将,将登陆时的信息保存在指定目录的文件中.在第一次登陆后,对用户名等在内存文件中保存. android界面: 界面: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_paren

C语言 二级指针内存模型

//二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素的指针:(我自认为此假设可应用于多维数组与指针) //②二级指针的主要功能是修改一级指针的值 //打印一维数组 int PrintArr(char **pin,int num){ int ERRO_MSG = 0; if (pin==NULL) { ERRO_MSG = 1; printf("pin