学习C++ -> 指针初步

一、指针
    1. 什么是指针?
        我们知道, 计算机的内存是由一个个独立的存储单元组成, 并且系统会对每一个存储单元分配一个唯一的号码, 称为这个存储单元的"地址"。分配号码给一个存储单元的目的是为了便于找到它, 从而进行进一步的操作, 比如是读取还是写入。
        
        在C++中, 如果要对某个存储单元进行访问(读取/写入), 有两种方式, 一是通过变量名找到存储地址再进行访问, 二是直接通过存储地址进行访问。
            1>. 通过变量名进行访问
                通过变量名进行访问就是我们通过编译器起一个名字, 程序在运行时, 系统为该程序建立一个变量名与内存单元地址之间的映射表, 通过名字即可找到该存储单元的地址并进行操作。例如:
                    char name ;        int value = 10 ;    float price ;
                等这些都属于通过变量名对内存单元中的值进行操作。
                
            2>. 通过地址直接访问
                显然, 通过地址直接进行访问要比经过一次 "中转" 速度更快, 既然要通过地址进行直接访问那么就必须要知道这个地址的值(编号)是多少, 并且要把这个地址值(编号)给保存起来, 这样才能方便后来随时直接访问这个地址。
                
                在这种方式中, "地址" 给他起了个新的名字, 叫指针, 而保存指针的变量称为指针变量。
                
                
    2. 认识指针
        同一般的变量, 每种变量都有自己的数据类型, 如 int a ; 说明这个变量是保存一个整数的。 指针亦是如此, 定义一个指针变量:
            int *pa ;
        int *pa ; 则表示变量pa是一个指针变量, pa应当保存类型为int的变量在内存中的地址。
        同理, 我们还可以定义其他类型的指针变量:

            char   *pa ; int    *pb ; float  *pc ; double *pd ;

            ...
        定义时, 其*号的位置可以靠左( int* pa; ), 居中( int * pa; )或靠右( int *pa; ), 具体使用哪种形式可根据个人习惯。
        一个语句中也可以同时定义多个指针变量, 方法为:

            int *pa, *pb, *pc ;

 
            
    3. 指针的初始化与赋值
        我们已经知道, 指针变量中所保存的内容为内存的地址, 要对指针变量进行初始化首先应该取到被指向的变量在内存中的地址。在C++中, 用 '&' 符号来获取变量的地址, 如:

        #include <iostream>

        int main() { int a =  ; std::cout<< &a ;    //输出变量a在内存中的地址

            return  ; }

 
        输出窗口显示:

        0x23ff4c Process returned  (0x0)   execution time : 0.031 s Press any key to continue.

 
        这个 0x23ff4c 就是以16进制输出的当前a变量在内存中的地址, 这个值与当前计算机内存的状态有关, 所以不同计算机输出的可能不同。
        
        指针可以在定义时对其进行初始化, 如:

            int a =  ; int *pa = &a ;

        也可以对指针变量进行赋值操作:

            int *pb ; int b =  ; pb = &b ;        //将b的地址赋值给指针变量pb

 
            
            
    4. 指针的初步使用
        知道了如何对指针类型进行定义、初始化以及如何赋值后就可以初步的去运用指针了, 首先看一个运用示例:

        #include <iostream>

        int main() { int a =  ; int *pa = &a ;      //定义指针变量pa并初始化地址为变量a在内存中所在的地址
std::cout<< a << "\n" ; //通过变量名访问a变量所在的地址
std::cout<< *pa << "\n" ; //运用*号访问指针变量pa中所保存的地址 return ; }

        输出:

         Process returned  (0x0)   execution time : 0.016 s Press any key to continue.

 
        可以看到, std::cout<< a << "\n" ;std::cout<< *pa << "\n" ; 输出的是相同的结果, 都是10。这是因为 a 与 *pa 实际上都是指向同一个存储地址, *号为间接访问符, 表示要访问指针变量中所存放的内存地址。
        
        再看一个示例, 运用指针改变变量的值:

        #include <iostream>

        int main() { int b =  ; int *pb = &b ; std::cout<<"改变前b变量中的值:"<<b<<"\n" ; *pb =  ;      //运用指针改变变量a所在的存储单元中的内容
std::cout<<"改变后b变量中的值:"<<b<<"\n" ; return ; }

        这里运用 *pb = 20 ; 来改变变量b的值, 其功能与 b = 20 ; 的作用相同, 实际他们所改变的都是同一段内存单元中的值。只要能够理解这点, 在掌握指针上会有很大的帮助。
        
        
    5. 指针运用时需要注意的一些问题
        1>. 左右两边类型要一致
            什么类型的指针变量存放什么类型的地址。
            
        2>. 避免"野"指针
            所谓的野指针即为没有被正确初始化或赋值的指针, 他会随机指向内存中的某个存储单元, 如果不慎通过这个指针对其内存中的值进行其他操作的话后果是不可预知的。 总之, 要保证指针指向的正确性, 在不用时要及时对其赋值为 NULL, 即将其指向的地址设为NULL, 也就是空指针。

            

这里所学习的内容为指针的一些最基础的知识, 或许在这里并没有体现出指针的如何强大, 但随着学习的深入使用指针的优势就会逐渐体现出来。

(转) 学习C++ -> 指针初步的更多相关文章

  1. C++学习之指针的常见错误

    C++学习之指针的常见错误       我们在编程的过程中,有时候在使用指针的时候,删除一个指针以后一定要将这个指针设置为空指针,这是因为删除这个指针只是删除这个指针指向的地址,这个指针还真是的存在程 ...

  2. Android学习之Activity初步

    Activity作为Android的第一步接触的概念,在学习中将初步的认识总结下来,以便后续的回顾与反思. 1.在用Android Studio生成第一个helloworld应用程序运行在手机上时,发 ...

  3. 初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明

    1. 说到面向对象, 一个绕不开的话题,就是面向过程. 面向过程适合简单.不需要协作的事务. 面向过程 = 分解问题 + 逻辑为先 = 先细节,再整体. 对比面向过程, 面向对象是模块化的, 当我们思 ...

  4. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  5. 【C++】初次学习C++指针时的一些易混或疑惑的地方

    C++中的指针是一个比较复杂的知识概念,最近我有在学习这一方面的知识,就借此文章记录一下在学习时容易产生的混淆.本人初次发技术类的分享,可能会有纰漏,欢迎诸位指正^_^! 1.*在两种语境下的含义 先 ...

  6. 我的c++学习(12)指针作为函数参数

    ◆ 引用调用与指针传值调用C++中函数的参数的基本使用方法是传值.为了弥补单纯传值的不足,以引用作为函数的参数,从逻辑上讲引用是别名,在函数中对参数的操作,就是对实参的操作,而在物理上是传实参的地址. ...

  7. 我的c++学习(9)指针

    ◆ 1.指针变量的赋值.初始化与简单应用 ,y; y=; // y可以理解成该存储单元的当前名字 int *ip; // ip是一个指针(变量) ip=&y; // ip是存储空间y的地址 c ...

  8. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  9. C/C++学习笔记----指针的理解

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

随机推荐

  1. hdu 油菜花王国

    Problem Description 程序设计竞赛即将到来,作为学校ACM集训队主力,小明训练一直很努力.今天天气不错,教练也心情大好,破例给各位队员放假一天,小明就骑着自己的小电驴到郊外踏青去了. ...

  2. C++格式化字符函数

    格式化有很多种方法,啊,1,sprintf函数可以实现格式化字符串,并保存到一个字符数组2,snprintf也能实现但比起sprintf函数稍微要安全一些了啊3,ostringstream对象也能实现 ...

  3. mysql索引之组合索引

    多列索引又称组合索引,在mysql的查询操作中,我们经常会遇到多个搜索条件,如:$sql = "select * from article where content='ma4' and t ...

  4. 设置ActioinBar 的背景色以及Title的字体颜色

    //设置ActionBar背景 Drawable draw=this.getResources().getDrawable(R.drawable.actionbar_bg); getActionBar ...

  5. Altium designer PCB king (收录各种版本)

    不要再留念protel99se这么古老的PCB软件了,宝刀也经不起岁月的磨练. 相比Altium Designer,protel99se逊色多了.虽然很多人还是用这把已经快老的刀.作为新时代的新人,我 ...

  6. KEIL里 Volatile的用法

    volatile用于防止相关变量被优化. 例如对外部寄存器的读写.对有些外部设备的寄存器来说,读写操作可能都会引发一定硬件操作,但是如果不加volatile,编译器会把这些寄存器作为普通变量处理,例如 ...

  7. Android高德地图自定义Markers的例子

    下文为各位重点介绍关于Android高德地图自定义Markers的例子,希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法. 之前的博客里说了地图的嵌入和定位,今天就说说在地 ...

  8. sql server数据建表

    use edudbgoif exists(select * from sysobjects where name='department')drop table departmentcreate ta ...

  9. 【转】android移植之request_suspend_state: wakeup & init: untracked pid xx exited问题的解决

    原文网址:http://blog.csdn.net/dragon101788/article/details/8187880 Bluetooth: HIDP (Human Interface Emul ...

  10. 使用jQuery来检测远程图片文件是否存在

    使用jQuery来检测远程图片文件是否存在 最近为我的憨豆人笑园添加图片功能时,遇到了这个问题,用户可以填写一个远程的图片地址,也可以上传一个本地图片.为了不浪费服务器的资源,我们需要在客户端先对用户 ...