(转) 学习C++ -> 指针初步
学习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++ -> 指针初步的更多相关文章
- C++学习之指针的常见错误
C++学习之指针的常见错误 我们在编程的过程中,有时候在使用指针的时候,删除一个指针以后一定要将这个指针设置为空指针,这是因为删除这个指针只是删除这个指针指向的地址,这个指针还真是的存在程 ...
- Android学习之Activity初步
Activity作为Android的第一步接触的概念,在学习中将初步的认识总结下来,以便后续的回顾与反思. 1.在用Android Studio生成第一个helloworld应用程序运行在手机上时,发 ...
- 初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明
1. 说到面向对象, 一个绕不开的话题,就是面向过程. 面向过程适合简单.不需要协作的事务. 面向过程 = 分解问题 + 逻辑为先 = 先细节,再整体. 对比面向过程, 面向对象是模块化的, 当我们思 ...
- c语言学习笔记 - 指针和字符串
前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...
- 【C++】初次学习C++指针时的一些易混或疑惑的地方
C++中的指针是一个比较复杂的知识概念,最近我有在学习这一方面的知识,就借此文章记录一下在学习时容易产生的混淆.本人初次发技术类的分享,可能会有纰漏,欢迎诸位指正^_^! 1.*在两种语境下的含义 先 ...
- 我的c++学习(12)指针作为函数参数
◆ 引用调用与指针传值调用C++中函数的参数的基本使用方法是传值.为了弥补单纯传值的不足,以引用作为函数的参数,从逻辑上讲引用是别名,在函数中对参数的操作,就是对实参的操作,而在物理上是传实参的地址. ...
- 我的c++学习(9)指针
◆ 1.指针变量的赋值.初始化与简单应用 ,y; y=; // y可以理解成该存储单元的当前名字 int *ip; // ip是一个指针(变量) ip=&y; // ip是存储空间y的地址 c ...
- C++学习笔记 指针与引用
指针与引用 1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...
- C/C++学习笔记----指针的理解
指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...
随机推荐
- 判别linux机器字节序为大端还是小端
代码如下: #include <iostream> #include <arpa/inet.h> #include <cstdio> using namespace ...
- myeclipse10 如何把代码预览的窗口去掉
1,选择菜单: windows -> preferences2,在弹出窗口中选择General-> Editors -> FileAssociations3,在上方框内选择*.jsp ...
- jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com) - Web前端学习之路
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- python保留两位小数
python保留两位小数: In [1]: a = 5.026 In [2]: b = 5.000 In [3]: round(a,2) Out[3]: 5.03 In [4]: round(b,2) ...
- LeetCode_Pascal's Triangle
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...
- [jumping to the gate] 娱乐向setjmp
转载:http://tieba.baidu.com/p/1393753521 灌水的时候从goto一路拐到了setjmp, 顺便也试了试貌似这东西确实是没有析构效果的.之前并没有看过setjmp的实现 ...
- 【转】git 学习笔记( 随时更新中…… 最后更新日期201304281518)--不错
原文网址:http://blog.csdn.net/yasin_lee/article/details/5975070 GIT 是版本管理的未来! 推荐几个GIT教程网站 http://www-c ...
- 记忆2--记忆的"记"和"忆"
有时候也会想,我们是如何记住东西的?是如何想起来的?在写这篇文章的时候,想起初中的时候(应当是初二),语文老师检查唐诗背诵,在下面觉得已经能背起来的时候,去向老师背诵的时候,忘记了开头,干急想不起来, ...
- C++标准:C++不允许修改任何基本型别(包括指针)的暂时值
从<C++标准库>一书中看到这样一句话:C++不允许修改任何基本型别(包括指针)的暂时值,想了半天,实在不理解.基本类型char,int,float等等还有暂时值?例如int a=2,那么 ...
- Ubuntu 启动器/快捷方式/ 制作 (Eclipse为例)
首先,在路径/usr/share/applications/,中创建eclipse.desktop(如果没有的话) sudo touch /usr/share/applications/eclipse ...