C中的指针的指针

指针存储的是内存地址,那么当代码执行

int *iptr;
int a;
iptr = &a;

它表示iptr指向了a所在的内存地址。那么若执行

*iptr = 10;
printf("a = %d\n",a);

那么a的值为多少呢?

可以简单地写一个程序 cpoint1.c

#include<stdio.h>
int main()
{
	int a;
	int *iptr;
	iptr = &a;
	*iptr = 10;
	printf("a = %d\n",a);
}

在终端上利用gcc编译

#gcc cpoint1.c

执行后生成a.out执行文件

./a.out

会看到打印的是 a = 10

这里可理解为指针iptr指向了a所在的内存地址,那么当执行

*iptr = 10;

时,实际就是将10存到a所在的内存地址中。

现在了解了指针的基本概念,那么什么是指针的指针呢?

首先,假设小明、小华、小新他们三个是朋友,但是小明只有小华的电话号码,而小华只有小新的电话号码。那么如果小明想找小新的话,就得先联系小华,通过小华联系小新。

如果将小华和小新都当做一个内存的地址,那么小明指向小华,可理解为一级指针,小华再指向小新,这样就成了指针的指针。

int *iptr;
int a;
int **jptr;

上面已经知道了

iptr = &a;

指的是将a所在的内存地址赋值给iptr

那么jptr这个指针又该如何赋值。刚才小明小华小新的例子,可以这样解剖

int **小明;
int *小华;
int 小新;

首先小明要得到小新的地址,那么要通过小华。所以有

小华 = &小新;

这样小华就指向了小新,得到小新的地址,然后再将小华的地址转给小明,这样就可以完成小明得到小新的地址

小明 = &小华;

接下来看下面的程序 cpoint2.c

#include<stdio.h>
int main()
{
	int a;
	int *iptr;
	int **jptr;
	iptr = &a;
	jptr = &iptr;
	a = 10;
	printf("jptr = %d\n",**jptr);
}
#gcc cpoint2.c

编译执行的结果为:

jptr = 10

看明白了吗?

C中的指针的指针

时间: 2024-10-27 12:40:53

C中的指针的指针的相关文章

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同

多文档中建立一个对话框类,通过这个方法来在其他类中得到对话框对象指针,访问对话框成员

{ // 添加内容 m_pDrawTool = new CDrawToolDlg; m_pDrawTool->Create(IDD_DRAWTOOLS, this); m_pDrawTool->ShowWindow(SW_SHOW); // 让窗口出现在屏幕右下方 CRect dlgRect; CRect mainRect; m_pDrawTool->GetClientRect(&dlgRect); GetWindowRect(mainRect); // 计算显示的坐标 int

C语言中的sizeof中的数组和指针

1.引子 今日在看动态规划的0-1背包问题,看完后还是打算自己写着试试,毕竟实践才能出真知嘛.动态规划的结果是个二维数组dp,我copy书上的例子进行初始 memset(dp,0,sizeof(dp)),考虑到程序的健壮性,对于数组我都是用的动态申请,自然二维数组也不例外[动态二维数组的建立可参见本blog的延伸]. 程序写完后,但是却不能运行,开始单步调试,当进行到dp的赋值时老是报指针的错误!!!开始我以为是指针越界什么的,仔细才发现dp的数组维数确实要多申请一个用来存放初始情况的值(全是0

【通过操作指针,与指针做函数參数&amp;#39;实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 由于p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

通过操作指针,与指针做函数参数&#39;实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 因为p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

C++中值传递、指针传递、引用传递的总结

C++中值传递.指针传递.引用传递的总结 指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就是直接在实参的内存上修改,不像值传递将实参的值拷贝到另外的内存地址中才修改).指针/引用传递的另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧. 1.

QT 中使用 c++ 的指针

之前没有接触过 c++,不过听说 c++ 的指针很坑,直到最近在用 QT / C++ 写一个 Linux Deepin 系统上检测网络流量和网速的小程序时,发现 c++ 的指针用起来真的特别蛋疼. 不过好在花了几个小时最终还是明白了指针的用法. 有一段代码的原型大概是这样的: QList<NetFlowObject> netflowobj_list; /** 从 list 列表中找出网卡名为 ifname 的 NetFlowObject 对象 **/ bool getNfoFromList(Q

C++语言中数组指针和指针数组彻底分析

#################################                              ##       基本知识               ##                              ################################# 当然我们一切都是从最简单的内建类型开始,最后我会做一些推广.先看一下基本的形式,我们从这里起步! Cpp代码 --------------指针---------------- int a

彻底理解链表中为何使用二级指针或者一级指针的引用

 彻底理解链表中为何使用二级指针或者一级指针的引用 http://blog.csdn.net/u012434102/article/details/44886339 struct _node  {  void*data;  struct_node *prior;  struct_node *next;  } typedef_node Node;   //给这个_node结构体定义一个别名,任何使用_node的地方都可以用Node来替换 typedef_node* PNode;   //给这个指向