C语言中指针的指针是如何工作的?

 

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

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语言中指针的指针是如何工作的?

时间: 2024-10-28 03:57:49

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

C 语言中有趣第指针操作(转)

http://blog.csdn.net/ghevinn/article/details/37651149(反汇编题目需要分析) 4.取出内存区域的值 在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如: void main(){ int a[2] = {261,0}; int *pi = a; char *p = (char*)pi; cout << *(int *)p++ << endl;  //取出p

c语言中结构体指针

1.指向结构体的指针变量: C 语言中->是一个整体,它是用于指向结构体,假设我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到指向运算符"->". 举例说明: struct SunLL { int a; int b; int c; }; struct SunLL  * p;               //定义结构体指针 struct SunLL A = {1,2,3};    //定义一个SunLL类型的变量A

C语言中数组与指针

数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合. 指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据. 在大多是C语言书中,都有这样的说法,“数组和指针是相同的”.其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同. C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容. 定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的

C语言中函数和指针的参数传递

最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的.所以就产生了一些东西.和我们本来想的有差别. 一.明确C语言中函数的入口: C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来

1、C语言中的函数指针

一 通常的函数调用 1 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 2 3 int main(int argc, char* argv[]) 4 { 5 MyFun(10); //这里是调用MyFun(10);函数 6 7 return 0; 8 } 9 10 void MyFun(int x) //这里定义一个MyFun函数 11 { 12 printf("%d\n",x); 13 } 这个MyFun函数是一个无返回值的函数,它

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

原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7220688 C语言更多查看 C语言使用注意事项(一) C语言使用注意事项(二) C语言使用注意事项(三) 二级指针又叫双指针.C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针.C++中可以使用引用类型来实现. 下面讲解C中的二级指针的使用方法. 例如我们使用指针来交换两个整型变量的值. 错误代码如下: 一级指针 [cpp] view plaincopyp

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

在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体而言,应先定义一个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数(这里接口就像是注册的地方,实现类就是“注册人”,当实现类作为形参时,就是在需要的时候) package strateryDemo; import java.util.Ar

&#160;C语言中让人头痛的指针和内存

指针:也是变量,存放变量的地址. 指针是变量的一个间接,变量是内存的一个间接. 虚拟内存中地址总线确定了你能访问的内存空间. 32位cpu最大的虚拟内存: 2^32 = 4 GB 所以32位的XP使用8G内存并没有什么用. 指针存放的变量地址是一个十六进制的数据表示的一组数据,而并非实际的内存中的内容. int *pMyInt;   pmyint 表示存放的地址,是一块内存地址.     int 表示这块地址里面存放的数据类型   *表示指针变量 指针变量= 指针.描述方便.指针变量所存放的地址

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

1.数组和指针 int array[5] = {1,2,3,4,5};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) *

c语言中对指向指针的指针的理解?

1 /************************************************************************* 2 > File Name: ptr_to_ptr.c 3 > Author: Mr.Yang 4 > Purpose:演示指向指针的指针 5 > Created Time: 2017年06月02日 星期五 09时17分45秒 6 **************************************************