我们有时看到这样地饿代码:

int *ptr = &x;

这里,ptr是一个指向x在内存中的地址的指针。

假设有另外一条语句是这样地的:

int **ptr2 = &ptr;

我们定义了一个指向指针的指针。

假设我们的计算机是8bit的,地址也是8bit(因此只有256字节的内存)。下图代表内存的一部分(上面的一排数字代表地址)。

  45   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69

+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

|    | 58 |    |    | 63 |    | 55 |    |    | h  | e  | l  | l  | o  | \0 |    |

+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

从上面可以看到地址63是字符串“hello”开始的地方。这种情况,假设内存中只有一处出现了“hello”,那么:

const char *c = "hello";

定义c为指向字符串“hello”的指针,那么c里面的值是63。指针c自己也要存储在内存的某个地方,上面的例子中可以看到c存储在58的位置。既然我们能定义指向字符的指针,也就能定义指向指针的指针:

const char **cp = &c;

现在cp指向了c,cp中存储的是c的地址(58)。

甚至可以更进一步:

const char ***cpp = &cp;

cpp内存的是cp的地址,也就是55(在上面的例子中),cpp自身存储在60的位置。

为什么我们需要这些指针呢?

  • 数组名通常也是数组第一个元素的地址。如果数组中存储的数据类型是t,对数组引用的类型就是* t。假设有类型t的数组的数组(二维数组),自然地,对二维数组的引用类型就是*(*t)=**t,也即指向指针的指针。
  • 即使字符串的数组看起来像是一维的,事实上是二维的,因为字符串时字符的数组。因此,类型为char **。

C语言中指针的指针是如何工作的?的更多相关文章

  1. C语言中的函数指针

    C语言中的函数指针 函数指针的概念:   函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...

  2. 利用C语言中的函数指针实现c++中的虚函数

    C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...

  3. windev中的内存机制及其与C语言中的内存指针相似性(一)

    windev中的内存机制,是初入windev世界必须要越过的一道高山,以下我的理解和经验未必都对,如有错误或遗漏,以后再纠正或补充!另外,以下内容,咱先谈应用,再说对机制的认识和理解. 一.新建表单, ...

  4. 策略设计模式与c语言中的函数指针

    在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...

  5. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

  6. C语言中函数和指针的參数传递

    近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...

  7. c语言中结构体指针

    1.指向结构体的指针变量: C 语言中->是一个总体,它是用于指向结构体,如果我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体.那么我们要用指针取出结构体中的数据.就要用到指向运 ...

  8. C语言中的二级指针(双指针)

    原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7220688 C语言更多查看 C语言使用注意事项(一) C语言使用注意事项(二) ...

  9. C语言中数组与指针的异同之处!你不知道的编程奥秘~

    C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚.本篇侧重点在于分析数组与指针的关系,什么时候数 ...

  10. c语言中数组,指针数组,数组指针,二维数组指针

    1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...

随机推荐

  1. 给Select赋值 innerHTML 不兼容IE6\IE7\IE8\IE9

    <select class="b-select" id="location-province" name="Province" def ...

  2. hdu4536-XCOM Enemy Unknown(爆搜)

    XCOM-Enemy Unknown是一款很好玩很经典的策略游戏. 在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3 ...

  3. CentOS6.4安装mplayer

    1.准备软件 mplayer官网:http://www.mplayerhq.hu/design7/news.html RPM Fusion网址:http://rpmfusion.org/ EPEL网址 ...

  4. poj 3045 Cow Acrobats(二分搜索?)

    Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...

  5. VIm变成sublime (转)

    sublime在ubuntu下始终支持不是很好, 特别是对中文输入的支持,还有一些插件在ubuntu下也不能用. 在ubuntu下还是用vim吧.  我们一起把vim变成sublime. 只需要三步 ...

  6. 使用cx_Freeze 将python3代码打包成.exe程序

    在这里分享一下如何在py3下使用cx_Freeze打包pyqt5的程序 首先吐槽下,深深鄙视一下百度,各种百度各种没有,之前我在py2.7下使用pyqt4开发过一个小软件,用的是py2exe进行打包的 ...

  7. [转]Laravel 4之URL生成

    Laravel 4之URL生成 http://dingjiannan.com/2013/laravel-url/ 获取当前URL 获取当前URL有两种方式,URL::current()或URL::fu ...

  8. 实现Android操作系统11种传感器介绍

    在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROMETER 1 //加速度 #define ...

  9. [Protractor] Use protractor to catch errors in the console

    For any reason, there is an error in your code, maybe something like undefined error. Protractor sti ...

  10. SQL常用分页

    top式 string sqltext = string.Format(" SELECT TOP {0} * FROM '表' WHERE ('字段' NOT IN (SELECT TOP ...