- 浏览: 1481929 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
转自http://bbs.byr.cn/#!article/CPP/4470
发信人: kangkai810 (kangkai810), 信区: CPP 标 题: 彻底搞定C指针---指向指针的指针(转) 发信站: 北邮人论坛 (Fri Apr 4 11:32:54 2008), 站内 一. 回顾指针概念: 今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧! 当我们程序如下申明变量: short int i; char a; short int * pi; 程序会在内存某地址空间上为各变量开辟空间,如下图所示。 内存地址→6 7 8 9 10 11 12 13 14 15 ------------------------------------------------------------------------------------- … | | | | | | | | | | ------------------------------------------------------------------------------------- |short int i |char a| |short int * pi| 图中所示中可看出: i 变量在内存地址5的位置,占两个字节。 a变量在内存地址7的位置,占一个字节。 pi变量在内存地址9的位置,占两个字节。(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节) 接下来如下赋值: i=50; pi=&i; 经过上在两句的赋值,变量的内存映象如下: 内存地址→6 7 8 9 10 11 12 13 14 15 -------------------------------------------------------------------------------------- … | 50 | | | 6 | | | | -------------------------------------------------------------------------------------- |short int i |char a| |short int * pi| 看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。如: *pi=5; //就是等价于I=5; 你可以回看本系列的第二篇,那里有更加详细的解说。 二. 指针的地址与指向另一指针地址的指针 在上一节中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10。同样的,我们也可能让某个指针指向这个地址。 看下面代码: short int * * ppi; //这是一个指向指针的指针,注意有两个*号 ppi=π 第一句:short int * * ppi;——申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个short int * 类型指针变量的地址。 第二句:&pi那就是取pi的地址,ppi=π就是把pi的地址赋给了ppi。即将地址值10赋值给ppi。如下图: 内存地址→6 7 8 9 10 11 12 13 14 15 ------------------------------------------------------------------------------------ … | 50 | | | 6 | 10 | | ------------------------------------------------------------------------------------ |short int i|char a| |short int * pi|short int ** ppi| 从图中看出,指针变量ppi的内容就是指针变量pi的起始地址。于是…… ppi的值是多少呢?——10。 *ppi的值是多少呢?——6,即pi的值。 **ppi的值是多少呢?——50,即I的值,也是*pi的值。 呵呵!不用我说太多了,我相信你应明白这种指针了吧! 三. 一个应用实例 1. 设计一个函数:void find1(char array[], char search, char * pi) 要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。 设计:依题意,实现代码如下。 void find1(char [] array, char search, char * pa) { int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { pa=array+i break; } else if (*(array+i)==0) { pa=0; break; } } } 你觉得这个函数能实现所要求的功能吗? 调试: 我下面调用这个函数试试。 void main() { char str[]={“afsdfsdfdf\0”}; //待查找的字符串 char a=’d’; //设置要查找的字符 char * p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。 find1(str,a,p); //调用函数以实现所要操作。 if (0==p ) { printf (“没找到!\n”);//1.如果没找到则输出此句 } else { printf(“找到了,p=%d”,p); //如果找到则输出此句 } } 分析: 上面代码,你认为会是输出什么呢? 运行试试。 唉!怎么输出的是:没有找到! 而不是:找到了,……。 明明a值为’d’,而str字符串的第四个字符是’d’,应该找得到呀! 再看函数定义处:void find1(char [] array, char search, char * pa) 看调用处:find1(str,a,p); 依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。 整个调用如下: array=str; search=a; pa=p; //请注意:以上三句是调用时隐含的动作。 int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { pa=array+i break; } else if (*(array+i)==0) { pa=0; break; } } 哦!参数pa与参数search的传递并没有什么不同,都是值传递嘛(小语:地址传递其实就是地址值传递嘛)!所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。 (如果还有疑问,再看一看《第五篇:函数参数的传递》了。) 修正: void find2(char [] array, char search, char ** ppa) { int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { *ppa=array+i break; } else if (*(array+i)==0) { *ppa=0; break; } } } 主函数的调用处改如下: find2(str,a,&p); //调用函数以实现所要操作。 再分析: 这样调用函数时的整个操作变成如下: array=str; search=a; ppa=&p; //请注意:以上三句是调用时隐含的动作。 int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { *ppa=array+i break; } else if (*(array+i)==0) { *ppa=0; break; } } 看明白了吗? ppa指向指针p的地址。 对*ppa的修改就是对p值的修改。 你自行去调试。 经过修改后的程序就可以完成所要的功能了。
发表评论
-
weak_ptr解决循环引用问题
2021-03-08 21:12 1191C++11引入的三种智能指 ... -
gcc链接顺序
2019-10-12 18:25 653代码在 https://github.com/killinux ... -
c++11的function和bind
2019-09-10 16:12 538参考:https://www.cnblogs.co ... -
opengl的helloworld
2014-10-22 19:41 9091.我提供一个不需要配置环境就可运行的源码。 glut.h放在 ... -
画图板用c++实现和用js实现的websocket版本
2014-10-17 13:02 2134画图板 opencv的c++ #include <o ... -
c语言内存
2014-07-02 10:26 6971、C中内存分为五个区 栈:用来存放函数的形参和函数内的局部变 ... -
重定向stdout到文件
2014-03-05 18:37 5490把stdout重定向到文件 两种方法: 第一种方法没有恢复 ... -
通过nginx远程执行shell
2014-03-03 10:26 5098saltstack远程执行shell,远程管理等返回json已 ... -
c的urldecode
2014-02-28 18:22 1368#include <stdio.h> #in ... -
pthread的pthread_mutex_lock 的使用
2014-02-25 16:54 26157参考http://haoningabc.iteye.com/b ... -
c调用c++
2013-10-12 15:24 1182参考 http://www.cppblog.com/frank ... -
用C语言,实现接收管道输出的结果,并显示
2013-04-23 21:35 1950在shell里利用“|”管道干的事情就是io重定向,把“|”命 ... -
关于char * 与 char[]
2013-04-22 21:56 965问题引入: 在实习过程中发现了一个以前一直默认的错误,同样ch ... -
单向链表翻转
2012-12-25 23:41 1025临时笔记,创建一个链表 #include <stdl ... -
trie 树 的代码
2012-12-14 23:20 1144想起搜狐老大的一句话 看代码先看h文件,擦,当初感觉他这句话很 ... -
指针函数与函数指针的区别
2012-12-14 22:44 1204一、 1、指针函数是指带指针的函数,即本质是一个函数。函数返回 ... -
指针和数组
2012-11-14 22:40 1075转载http://kan.weibo.com/con/3512 ... -
js备份
2012-10-31 23:56 1730<!DOCTYPE HTML PUBLIC " ... -
线程的helloworld
2012-10-30 21:51 1610#include<stdio.h> #inc ... -
c的书籍
2012-10-30 10:56 1133http://www.acm.uiuc.edu/webmonk ...
相关推荐
指针是C/C++编程语言中的核心概念,它在程序设计中扮演着至关重要的角色。指针是一个变量,其存储的是内存地址,该地址指向另一个变量。理解并熟练使用指针,是提升编程技能的关键步骤。 一、指针的基础概念 1. ...
本文将深入探讨指针指针(指针的指针)的应用及其理解方法。 首先,我们要明白指针的基本构成和类型。一个指针声明通常由以下几个部分组成: 1. **指针的类型**:指针所指向的数据类型,如`int*`、`char*`等。 2. ...
"c++句柄、智能指针和指针的区别" 在C++编程中,句柄、智能指针和指针是三个相关但不同的概念。理解它们之间的区别对于初学者来说非常重要。 首先,让我们来讨论指针和句柄的区别。指针是指向物理内存地址的指针...
C语言中的指针是其强大的特性之一,也是学习C语言的关键。指针允许程序员直接操纵内存地址,从而实现高效和灵活的编程。本教程将深入探讨指针的概念、使用和重要性。 首先,理解指针的基本概念至关重要。在计算机中...
C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...
指针变量运算与指针数组相关知识点 指针变量是C语言编程中一个非常重要的概念,它允许我们直接访问和操作内存中的数据。指针变量是存储了数据地址的一种变量,它可以是数组、字符串、函数或普通变量的地址。 1. ...
指针、指针数组和多级指针的概念与应用 在编程语言中,指针是非常重要的概念之一。指针是一种变量,它存储的是另一个变量的内存地址,而不是实际的值本身。通过指针,可以访问和操作内存中的数据。今天,我们将重点...
指针 指针是一种保存变量地址的变量,是一种基本的计算机编程概念。它允许开发者直接访问和操作计算机内存中的变量,从而提供了更高的灵活性和控制力。 概念 在计算机中,内存是由存储单元构成的,每个存储单元...
### C语言指针详解:函数指针与指针函数 #### 第十章 指针 **一、指针的基本概念** 指针是C语言中一个非常重要的概念,它允许程序员直接操纵内存地址,这对于提高程序效率至关重要。理解指针的基础概念是学好...
### 函数指针与指针函数的理解 #### 一、函数指针与指针函数的基本概念 在C语言中,函数指针和指针函数是两个重要的概念,它们经常出现在较为复杂的程序设计中,尤其在回调函数、动态绑定等场景中发挥着重要作用。...
### C++指针应用教学:让你不再害怕指针 #### 前言:复杂类型说明 在编程领域,特别是对于C++这样的强类型语言而言,理解指针的概念及其使用方式至关重要。指针作为C++中一种特殊的变量类型,能够直接操作内存地址...
### 彻底理解指针,指针数组和数组指针,指针函数和函数指针 #### 一、基础知识 在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的...
在易语言编程中,"整数型转换到子程序指针"是一个常见的操作,涉及到程序设计中的类型转换和函数调用机制。易语言是一种以中文为语法的编程语言,旨在降低编程难度,让非计算机专业的人也能进行软件开发。在这个主题...
在C++编程语言中,指针是一个至关重要的概念,它提供了对内存地址的直接操作,使得我们可以高效地处理数据和实现复杂的数据结构。本篇主要探讨C++中的指针,特别是涉及C与C++中函数指针和指针函数的使用。 首先,...
### 指针详解 #### 一、理解复杂类型的规则 在编程中,尤其是C语言或C++等底层语言中,指针是一个重要的概念。掌握指针不仅能够帮助程序员更好地控制程序的行为,还能够提高代码的效率。对于初学者而言,理解和...
### 指针详解:不再畏惧C语言中的指针 #### 前言:理解复杂类型 在深入了解指针之前,我们首先需要掌握如何解析较为复杂的类型声明。这对于理解指针至关重要,因为指针本身的定义可能包含多个层级的复杂度。 ####...
C语言中的指针是其强大的特性之一,也是学习C语言时的一大难点。本文将深入探讨C指针的概念、用途、操作及其潜在的陷阱,帮助你彻底掌握这一关键知识点。 一、指针的基本概念 指针在C语言中扮演着变量地址的角色,...
指针是C/C++等编程语言中的核心概念,它在程序设计中扮演着至关重要的角色。本文将深入探讨指针的定义、类型、运算以及如何有效地使用指针,旨在帮助初学者克服对指针的恐惧,提升编程技能。 首先,我们要理解指针...