这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章《从四个属性的角度来理解C语言的指针也许会更好理解》,若已阅读,请继续往下看。
我从4个属性的角度来总结了C语言中的指针概念。对于C语言的一个指针,比如int *p,4个属性分别如下:
C语言指针p=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型);
这4个属性用来理解C语言中单个指针可以,那么本篇再用这4个属性来解释C语言中的“指针的指针”。
C语言中指针的指针,好多教材一般给出的定义是“变量的地址的地址”,或者是“指针的地址”,这满满的都是套路啊,理解一个地址就很难了,还地址的地址,深怕我们晕的还不够瓷实?好吧,先上一段代码,如下:
#include <stdio.h>
int main(void)
{
int a = 1; //定义一个普通的整型变量a,初始值是1
int *p = NULL; //定义一个C语言的指针变量p,初始值是NULL;
int **pp = NULL; ////定义一个C语言的指针的指针变量pp,初始值是NULL;
p = &a; //指针p的值是变量a的地址;
pp = &p; //指针的指针pp的值是变量p的值;
printf("整型变量a的值是%d, 整型变量a的地址是%x\n", a, &a); //输出变量a的值和变量a的地址
printf("指针p的地址是%x, 指针p的值是%x, 整型变量(*p)的值是%d\n", &p, p, *p); //输出变量p的地址,变量p的值,变量p指向的值
printf("指针的指针pp的值是%x, 整型变量(*pp)的值是%x\n", pp, *pp); //输出变量pp的值,pp指向的值
return 0;
}
代码的含义已经在代码注释中写出来了。看上去有点晕啊,又是“地址”,又是“指针”的,还有“指针的指针”。。。。。。
再贴个运行的结果,如下:
对此结果做个解释:
1.有一块内存区域,它的名字叫“a”,它的地址是“22fee8”,里面存了一个值“1”;
2.又有一块内存区域,它的名字叫“p”,它的地址是“22fee4”,里面存了一个值“22fee8”;
3.又又又有一块内存区域,它的名字叫“pp”,里面存了一个值“22fee4”;
好了,现在咱就用那4个属性来分析下C语言指针p和指针的指针pp。先看下指针的指针pp。套用4个属性:
C语言指针的指针pp=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型)
将每个属性具体化,在本文中就是:
C语言指针的指针pp=(22fee4,p,22fee8,int)
哈哈,有没有看出什么名堂出来?
第1个属性值“22fee4”是指针的指针pp自己的值,一般没什么用处,所以不用去关心。从第2个属性开始,也就是:p,22fee8,int,这些都是指针p的属性啦,如下图所示:
那么:
C语言指针的指针pp=(22fee4,p,22fee8,int)可以写为:
C语言指针的指针pp=(22fee4,指针p的第1个属性,指针p的第1个属性的值,指针p的第4个属性);
也就是从第2个属性开始,就可以抛弃指针的指针pp,不用去想这个pp了,请完全用指针p的思维来考虑问题。
好了,现在再从4个属性来考虑指针p:
C语言指针的指针p=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型);
再将每个属性具体化,就是:
C语言指针的指针p=(22fee8,a,1,int);
哈哈,又看出啥名堂来了吧?
第一个属性值“22fee8”是指针p自己的值,一般也没什么用处,所以也不用去关心。从第2个属性开始,也就是:a,1,int就是变量a的属性啦,如下图所示:
那么:
C语言指针的指针p=(22fee8,a,1,int)可以写为:
C语言指针的指针p=(变量a的第1个属性的值,变量a的第2个属性,变量a的第3个属性的值,变量a的第4个属性);
也就是从第2个属性开始,就可以抛弃指针p,不用去想这个p了,请完全用变量a的思维来考虑问题。
所以啊,指针的指针pp,指针p,变量a,三者的关系是pp的属性包含着p的属性,p的属性包含着a的属性,我们只需要像剥洋葱那样,一层一层地拨开,就会发现最终的变量a了。
本文为作者原创,非独家,欢迎转发并关注ShiXP的微博:http://weibo.com/520JDH
这样子来理解C语言中指针的指针的更多相关文章
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- windev中的内存机制及其与C语言中的内存指针相似性(一)
windev中的内存机制,是初入windev世界必须要越过的一道高山,以下我的理解和经验未必都对,如有错误或遗漏,以后再纠正或补充!另外,以下内容,咱先谈应用,再说对机制的认识和理解. 一.新建表单, ...
- 【转载】理解C语言中的关键字extern
原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...
- C语言中的函数指针
C语言中的函数指针 函数指针的概念: 函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...
- 利用C语言中的函数指针实现c++中的虚函数
C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- c语言中对指向指针的指针的理解?
/************************************************************************* > File Name: ptr_to_pt ...
- 1、C语言中的函数指针
一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...
随机推荐
- WAMP采用别名时ThinkPHP5项目设置方法
打开public目录下的.htaccess文件,并在其中添加 RewriteBase /xxx<IfModule mod_rewrite.c> Options +FollowSymlink ...
- WPF中的多进程(Threading)处理实例(二)
原文:WPF中的多进程(Threading)处理实例(二) //错误的处理 private void cmdBreakRules_Click(object sender, RoutedEventArg ...
- 小记同学一次奇葩的DNS欺骗实验失败经历
这是一个DNS欺骗实验,使用kali的ettercap.有受害者.攻击者(虚拟机).Web服务器三台机器.受害者的事124.16.70.105虚拟机的是124.16.71.48web服务器是124.1 ...
- 仿win7窗体自动顶部最大化左侧右侧半屏效果(改写nativeEvent,使用AdjustWindowRectEx)
#include "HMainWindow.h" #include <QApplication> #ifdef Q_OS_WIN #include <qt_win ...
- PRML Chapter4
超平面(hyperplane) 超平面:超平面是n维欧氏空间中余维度等于一的线性子空间,也就是说必须是(n-1)维度.这是平面中的直线.三维空间中平面的推广(n大于3才被称为"超" ...
- Qt在Windows下的三种编程环境搭建(图文并茂,非常清楚)good
尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器 ...
- 【Web前端Talk】React-loadable 进行代码分割的基本使用
随着项目功能的扩充.版本迭代,我们与Webpack捆绑起来的的项目越来越大,大到开始影响加载速度了.这时我们就该考虑如何对代码进行拆分了. 这次我们一起学习一下如何对React项目中的代码进行Code ...
- java设计模式-原型(prototype)
有时候创建对象是需要耗费很多资源,但是每个对象之间又有大量的重复.我们可以选择在创建好一个对象后,以之作为模板克隆出其他对象,稍作修改,即可用于其他地方. 需要实现Cloneable接口,重写clon ...
- netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理 ...
- 文件识别浅谈(含office文件区分)
前言 本文主要根据后台接口识别Office文件类型这一话题做一些分享,主要方向还是放在不能获取到文件名情况下的Office文件识别. 可获取到文件名 如果后端接口可以获取到完成的文件名称,则整个过程会 ...