C++初识指针之一
新手学习C/C++都跳不过去的地方,就是指针,用的话,确实好用,但是概念比较绕,
指针的通俗说法
1.简单的来说,就是说每一个变量,在电脑内都占一个地方,这个地方用一个16进掉的编号来进行标记,类似于,一个人有身份证,那要找你的时候,可以能过身份证来查找你的信息.指针,就是用来指向这个编号的.
2.这个地址是本身是常量,是改不了的,记住这一点,但是可以让指针,指向其他地址,这个是可以的,
比如你本人有一个身份证,你记住了号码,这时你的朋友他也有一张身份证,你也可以记住他的身份证号,但是此时,你的身份证不会因此改变.
3.声明指针 类型 * 变量名
声明一个指针,用来存放变量的地址,此时,这个指针就会指向这个变量的地址,那么,如果此时操作指针,就相当于在修改这个变量.
例如:
可以看到,在=号的右边时我们用指针,将a的值赋给了变量b.

如果直接输出p,我们得到了a的地址.
如果我们输入*p,即得到a的值

---->>>其中,指针的类型和要指向的变量地址的变量本身的类型要一致,不能说是字符型的指针,来指向一个整型的变量,这样是不可以的.<<<------重点!!!
变量的地址用&来表示取地址.那么此时,整型指针p,就指向了整变量a的地址.如果此时输出p就可以得到a的地址,如果想返回a的值,那么需要在p前加一个*号即可.
此处的*号和声明这里的*号是含意不同的.在=号运算符的右边或者输出的时候,此时叫解运算,即得到指针所指向的变量本身.
比如本例中, int* p= &a;在=号左边时,称为左值,为左值时,此时是用来声明这个声针,如果为右值或者输出的时候,表示是取a的值.
插播一下:在C/C++中,如果用const关键字来声明一个常量,用指针是可以进行修改的,所以最好用宏定义来声明一个常量,用全大写来命名;
再插一下:常量,即不会改变的量,比如.圆周率,常记为:3.1415926,又比如一天有24个小时,白天12小时,晚上12小时,1小时60分钟,1分钟60秒,一周有7天,这些是不会改变的,即常量
常量的声明方式为:#define HOUR
======================================================================================================
重点来了,无情分割线
======================================================================================================
当声明的指针类型为字符的时候,那么这个指针可以接收字符串,即可以看作以下的形式:
//声明一个字符数组
char chr_a[128]="hello";此时等价于 char* str="hello";
但是,要注意的是,最好不要直接给指针赋值,如上面这面 char* str="hello";这样是很安全的,因为hello此时是一个随机的地址,这个地址有可能会有变化,这是很危险的
编程还是要养成好习惯,把可能发成的错误消灭掉,那么上面的声明方式可以修改为这样:
char str_a[]="hello";
char* str1= str_a;
这样就是安全的方式了.
此时指针的地址,实际为str_a[0],也就是字符数组的第0个元素.char str_a[]="hello";可以看作是 char str_a[]={"h","e","l","l","o"};
对数组的元素操作的时候,以下这样的操作是相同的
for (int i =0;i<5;++i)
{
cout << *(str1+i) << endl;
cout << str_a[i] << endl;
}

4.空指针
当声明了一个指针,但是没有具体的地址指定给它的时候,可以置空或者是0.
例如:char* p = NULL;
char* p2= 0;
这两种都是可以的,但是此时p和p2是不可以传值的,虽然语法上是没有问题,但是不会输出任何的结果.如下:

但是,可以把地址传给空指针.此时空指针只指向了被传地址的首地址,如上面的例子中str1指向的首地址是字母h的地址,也就是字符数组的首元素,str_a[0].
此时取str2和str3,会得到如下

关于空指针先写到这里,还有一些我还未理解透彻,写本文算是做一个笔记,把自己理解的东西记录下来.
C++初识指针之一的更多相关文章
- 深入理解C指针之一:初识指针
原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静 ...
- 02 C语言指针
今天发帖记录自己学习C语言精髓的心理历程,人生就像是一次旅途,沿途总是能看到最美的风景,让我们的思想相逢在C语言中. 一 初识指针,指针的定义 指针是C语言中的一种类型,类似于整形,字符型等.既然C指 ...
- 2-Linux C语言指针与内存-学习笔记
Linux C语言指针与内存 前面我们对于: c语言的基本用法 makeFile文件的使用 main函数的详解 标准输入输出流以及错误流管道 工具与原理 指针与内存都是c语言中的要点与难点 指针 数组 ...
- (0)c++入门——认识指针与数组——指针即是内存中地址。
初识指针 首先需要了解一个概念,计算机的内存(或者说是寄存器)都是有地址的. <c++ primer plus>一书P37中提到这样一个概念:为把信息存储在计算机中,程序必须记录3个基本属 ...
- 006-unity3d GUI初识、贴图、自定义鼠标指针
一.gui概念 无论摄像机拍摄到的图像怎么变换,GUI永远显示在屏幕上,不受变形.碰撞.光照的影响.对话框.战斗值.能量等.示例:用手机录像,摄像的参数不会随着拍摄场景变换.GUI基础GUI部分是每帧 ...
- OC 初识NSString,self关键字,继承,成员变量的可见性,description方法
OC 初识NSString,self关键字,继承,成员变量的可见性,description方法 初识 NSString: char * string = "旭宝爱吃鱼"; 常量字符 ...
- 初识PHP
初识PHP 虽然是做前端的,可是平时看书.做项目都会与后端PHP相关,但却不是很了解,并经常听PHP大神说:PHP是世界上最好的语言!因此,通过这篇博文学习.总结PHP,来认识认识这个“世界上最好的语 ...
- 你好,C++(40)7.1 一切指针都是纸老虎:彻底理解指针
第7章 C++世界的奇人异事 在武侠小说中,初入武林的毛头小子总是要遇到几位奇人,发生几件异事,经过高人的指点,经历一番磨炼,方能武功精进,从新手成长为高手.在C++世界,同样有诸多的奇人异事.在C+ ...
- ARC - strong和weak指针
ARC指南1 - strong和weak指针 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是"本地变量&qu ...
- Python初识与简介【开篇】
目录 1.扯淡 2.Python历史 3.Python简介 4.Python应用 5.为什么是python而不是其他语言? 6.Python的种类 7.Python的特点 8.Python设计哲学 9 ...
随机推荐
- 正确引用R及R包
R版本不断更新,为保证数据可重复性,引用R时需标注出对应的R版本.那么如何引用呢? 打开R,键入citation(),得到对应的版本引用信息. To cite R in publications us ...
- spring security 从零开始搭建
1.引入 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...
- window.open在打开pdf时直接下载而不是查看
一般这是url请求的原因导致的, 可以考虑这种写法 window.open(link+'?response-content-type=application/pdf') 加上后面这段可以转为查看
- 01.BeanFactory实现
/** beanFactory 不会做的事:* 1.不会主动调用BeanFactory 后处理器* 2.不会主动添加Bean后处理器* 3.不会主动初始化单例(懒加载)* 4.不会解析beanFact ...
- xss.haozi.me靶机XSS练习心得
xss.haozi.me靶机XSS练习心得 //server code function render (input) { return '<div>' + input + '</d ...
- JS 将伪数组转换成数组
在 JS 中,伪数组 是非常常见的,它也叫 类数组.伪数组可能会给 JS 初学者带来一点困扰. 本文将详细讲解 什么是伪数组,以及分别在 ES5 和 ES6 中将伪数组转换成真正的数组 . 什么是伪数 ...
- C# 使用CefSharp完成自动签到
1首先新建项目,右键项目选择管理NuGet 程序包,在浏览中搜索CefSharp.Winfrom ,点击安装,会自动安装相应的包.因为CefSharp是不能以AnyCPU的模式运行所以需要修改配置,有 ...
- cookie和session、token的区别
原作者:施杨(施杨's Think out)出处:http://shiyangxt.cnblogs.com ************** 本文版权归原作者和博客园共有,欢迎转载,转载请保留该申明 ** ...
- get 和 post 请求在缓存方面的区别
get 请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以 使用缓存. post 不同,post 做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用 缓存.因此 ge ...
- vue 在 v-for 时给每项元素绑定事件需要用事件代理吗?为什么?
vue本身不做事件代理(react将所有事件都委托到document上,然后进行派发) 普通html元素和在组件上挂了.native修饰符的事件.最终EventTarget.addEventListe ...