学习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. DOM 其他一些特性

    cookie 允许javascript程序读写HTTP cookie 的特殊的属性 domain 允许当Web页面之间交互时,相同域名下相互信任的Web服务器之间协作放宽同源策略安全限制 (JavaS ...

  2. Bootstrap 模态对话框 remote指定内容加载

    第一个页面: .....其他内容..... <div class="modal" id="ID_ReformDetail"> <div cla ...

  3. 如何在word中写出赏心悦目的代码

    短学期的VHDL终于结束了,虽然代码并不是很难,但是框框条条的规矩很多,也算折腾了一会,最后要写一个技术手册,结题报告类似物.考虑到word毕竟套主题比较方便,所以也就没有用LaTeX写,但是很快就发 ...

  4. CentOS6.4/6.7下Mysql数据库的安装与配置(转载)

    通过RPM方式 给centos  安装mysql  最好有光盘,呵呵,网络也可以下载rpm安装包,不过文件较大. 1 挂载光盘 mount /dev/cdrom /mnt/cdrom/mount: b ...

  5. 【转】android cts failed items

    原文网址:http://blog.csdn.net/linsa0517/article/details/19031479 Fail的一些修改   1.直接设置问题 estUnknownSourcesO ...

  6. 通用多目录makefile的写法

    我的项目文件层次是:项目名称/include.output.src src/admin.stu.tch.common 最外层的Makefile: DEBUG = yMYDEBUG = DEBUGife ...

  7. CF 584B Kolya and Tanya

    题目大意:3n个人围着一张桌子,给每个人发钱,可以使1块.2块.3块,第i个人的金额为Ai.若存在第个人使得Ai + Ai+n + Ai+2n != 6,则该分配方案满足条件,求所有的满足条件的方案数 ...

  8. SSH2.0编程 ssh协议过程实现

    之前为了自己做一套SSH,先自己实现了一套telnet.但经过这么多天的苦逼,发现以前的工作都是徒劳.ssh的协议很繁杂,核心的内容在于密码算法,而且自己很难在网上找到周全的细节讲解与详细的实现,只有 ...

  9. C# 实现简单状态机(参考代码)

    using System; namespace StateMachine2.State { public enum AnimationState { Walk = , Dead, } public a ...

  10. 增强型表格/报表-jqGrid使用浅析

    jqGrid是一个基于Jquery的表格插件,官网地址:http://www.trirand.com/blog演示地址:http://www.trirand.com/jqgrid/jqgrid.htm ...