(转) 学习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 ...
- 线段树练习 codevs 1080
/* codevs 1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 一行N个方格,开 ...
- encodeURI后台乱码(解决)
window.location.href = xxxx?a=encodeURI(encodeURI(name)) ; name是中文,页面部分需要编码两次 name = java.net.URLDec ...
- Java 执行终端命令实现,调用执行另外一个Java文件
Test.java package com.journaldev.files; public class Test { public static void main(String[] args) { ...
- [Mugeda HTML5技术教程之17] 理解Mugeda访问统计结果
1. 功能简介 Mugeda提供动画统计功能,使得动画制作者可以直观的了解动画的浏览情况,包括浏览量,参与度,以及观看者的分布情况. 目前统计功能主要展示动画内容和广告工程的统计数据.在动画被发布或导 ...
- 从运行原理及使用场景看Apache和Nginx
用正确的工具,做正确的事情. 本文只作为了解Apache和Nginx知识的一个梳理,想详细了解的请阅读文末参考链接中的博文. Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务 ...
- 远程调试 Azure 上的 Website
让我们先检查一下使用的 Azure SDK 版本和 Visual Studio 版本.根据MSDN的介绍,Azure 的远程调试功能是在 Azure SDK 2.2 中加入的,所以请确保您的机器上安装 ...
- AFNetworking 使用 核心代码
///////////////////////////以前用法///////////////////////////////////////////////////////////// //使用AFH ...
- [TYVJ] P1005 采药
采药 背景 Background NOIP2005复赛普及组第三题 描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师 ...
- UESTC 75 The Queen's New Necklaces
题意:一个项链的珠子的颜色有若干种.每种颜色的珠子个数为Ai.求有多少种不同的项链? 我们考虑,如果旋转i个珠子,那么会产生gcd(n,i)个循环节,每个循环节的大小我们假设为K,那么如果有一个颜色的 ...