第一次作业:学习C++指针
目录
1 内存空间的访问方式
2 指针变量的声明运算和赋值运算
2.1 指针变量的声明
2.2 与地址有关的运算以及指针的赋值
2.3 指针的赋值
3 指针的运用
3.1 指针运算
3.2 用指针处理数组元素
3.3 指针数组
4 指针的其他运用——函数
4.1 指针型函数
4.2 指向函数的指针
1 内存空间的访问方式
计算机的内存存储器被划分为一个个存储单元。储存单元按一定的规则编号,这个编号就是存储单元的地址。地址编码的基本单位是字节,每个字节由8个二进制位组成,也就是说每个字节是一个基本内存单元,有一个地址。计算机就是通过这种编号的方式来管理内存数据读写的准确定位的。
C++程序通过两种方式利用内存单元存取数据:一是通过变量名,二是通过地址。例如:对于一些常见的32位的系统,short型占2个字节,long型占4个字节。在变量获得内存空间的同时,变量名也就成了相应的内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间。但是,有时使用变量名不够方便或者根本没有变量名可用时,表现在程序语句中就是需要直接用地址来访问内存单元。
2 指针变量的声明运算和赋值运算
2.1 指针变量的声明
指针也是一种数据类型,具有指针类型的变量称为指针变量。指针变量是用于存放内存单元地址的。
指针也是先声明后使用,声明指针的语法形式时:
数据类型 *标识符
其中”*“便是这里声明的是一个指针类型的变量。数据类型可以是任意类型,指的是指针所指向的对象(包括变量和类的对象)的类型,这说明了指针所指的内存单元可以用于存放什么类型的数据,称之为指针的类型。
2.2 与地址有关的运算以及指针的赋值
C++提供了两个与地址相关的运算符——“*”、“&”。“**”称为指针运算符,也称解析(dereference),表示获取指针所指向的变量的值,这是一个一元操作符。“&”称为取地址运算符,也是一个一元运算符,用来得到一个对象的地址。
1)一元运算符“*”出现在声明语句中,在被声明的变量名之前时,表示声明的是指针,例如:
int *p;  //声明p是一个int型指针
2)“*”出现在执行语句中或声明语句的初始化表达式中作为一元运算符时,表示访问指针所指对象的内容,例如:
cout << *p; //输入指针p所指的内容
3)“&”出现在变量声明语句中位于被声明的变量左边,表示声明的是引用,例如:
int &rf //声明一个intxing
4)”&“再给变量赋初值时出现阿紫等号右边或在被执行语句中作为一元运算符出现时,表示取对象的地址,例如:
int a,b;
int *pa,*pb=&b;
pa=&a;
2.3 指针的赋值
- 在定义指针的同时进行初始化赋值。语法形式为:
 
存储类型 数据类型 *指针名 = 初始地址;
- 在定义之后,单独使用赋值语句。赋值语句的语法形式为:
 
指针名 = 地址
如果使用对象地址作为指针的初值,或在赋值语句中将对象地址赋给指针变量,该对象必须在赋值之前就声明过,而且这个对象的类型应该和指针类型一致。也可以使用一个已经赋值的指针初始化另一个指针,这就是说,可以使多个指针指向同一个变量。
一个数组,可以用它的名称来直接表示它的起始地址。数组名称实际上就是一个不能被赋值的指针,即指针常量。
关于指针类型还有以下方面应该注意:
- 可以声明指向常量的指针,此时不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。例如:
 
int a;
const int *p1=&a;  //p1是指向常量的指针
int b;
p1=&b;
*p1=1;
- 使用指向常量的指针,可以确保指针所指向的常量不被意外更改。
 
int * const p2=&a;
p2=&b;
- 经过使用类型显式转换,通过void类型的指针便可以访问任何类型的数据。
 
0专用于表示空指针,也就是一个不指向任何有效地址的指针,要养成一个好的习惯,如果不便于用一个有效地址给一个指针变量赋初值,那么应当用0作为它的初值,从而避免指向不确定的指针出现。
3 指针的运用
3.1 指针运算
一般来讲,指针的算术运算是和数组的使用密切联系的,因为只有在使用数组是,才会得到连续分布的可操作内存空间。对指针的进行算数运算时,一定要确保运算结果所指向的地址是程序中分配使用的地址。
3.2 用指针处理数组元素
指针加减运算的特点使得指针特别适合于存储在一段连续内存空间中的同类数据。二数据恰好是具有一定顺序关系的若干同类型变量的集合体,数据元素的储存在物理上也是连续的,数组名就是数组存储的首地址。
细节 把数组作为函数的形参,等价于把指向数组元素类型的指针作为形参。
void f(int p[]);
void f(int p[3]);
void f(int *p);
设有一个int型数组啊,有10个元素。用三种方法输出个元素。
//使用数组名和下标
#include <iostream>
using namespace std;
int main(){
  int a[10]={1,2,3,4,5,6,7,8,9,0};
  for (int i=0;i<10;i++)
    cout<<a[i]<<"  "
    cout<<endl;
  	return 0;
}
//使用数组名和指针运算
#include <iostream>
using namespace std;
int main(){
  int a[10]={1,2,3,4,5,6,7,8,9,0};
  for(int i=0;i<10;i++)
    cout<<*(a+i)<<" ";
  cout<<endl;
  return 0;
}
//使用指针变量
#include <iostream>
using namespace std;
int main(){
	int a[10]={1,2,3,4,5,6,7,8,9,0};
	for(int *p=a;p<(a+10);p++)
    cout<<*p<<"  ";
  cout<<endl;
  return 0;
}
结果都为:

3.3 指针数组
如果一个数组的每一个元素都是指针变量或者是指针常量,那么这个数组就是指针数组。
例如用指针数组输出一个矩阵:
#include <iostream>
using namespace std;
int main(){
    int line1[]={1,0,0};
    int line2[]={0,1,0};
    int line3[]={0,0,1};
    int *pLine[3]= {line1,line2,line3};
    cout<<"Matrix test:"<<endl;
    for (int i=0;i<3;i++){
        for (int j=0;j<3;j++)
            cout<<pLine[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

4 指针的其他运用——函数
4.1 指针型函数
当一个函数返回值是指针类型时,这个函数就是指针型函数。使用指针型函数的最主要的目的就是要在函数结束时把大量的数据从被调函数返回到主调函数。
指针型函数的一般定义形式是:
数据类型 *函数名(参数表)
{
	函数体
}
4.2 指向函数的指针
每一个函数都有函数名,实际上这个函数就表示函数的代码在内存中的起始地址。由此看来,调用函数的通常形式“函数名(参数表)”的实质就是“函数代码首地址(参数表)”。
声明一个函数指针时,也需要说明函数的返回值,形式参数列表,其一般的语法如下:
数据类型 (*函数指针名)形参表
												
											第一次作业:学习C++指针的更多相关文章
- Java第一次作业——Java语言基础
		
<Java技术>第一次作业 学习总结 1.Scanner类实现基本数据输入方法 Scanner input=new Scanner(System.in); int num = input. ...
 - C 语言学习 第一次作业总结
		
第一次的作业是冯老师布置的练习题,需要在pta平台上完成.我这边看不到结果,但是透过冯老师给出的截图,同学们都还是认真的去做的.同时,我这边也布置了一个持续 3 周的作业:熟悉 git 的使用.因为后 ...
 - 停下来,回头看  ——记2020BUAA软工第一次作业-热身!
		
description: 'Mar 1st, 2020 - Mar 3rd, 2020' 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 第一次作 ...
 - 耿丹CS16-2班第一次作业汇总
		
第一次作业统计完成. 注:1.作业顺序:取最早交作业的前3名,依次拿5,2,1分,前提是作业质量较高,否则轮至下一名同学得分,其余同学得0分:2.作业情况:满10分,空一题扣2分,心得写得好的有额外加 ...
 - 2015级软工实践k班第一次作业-准备
		
第一次作业-准备······ 几篇文章阅读下来发现一个事实,还是要有明确的目标,清楚自己需要做什么最为重要.然后根据目标确定需要为之所做的准备工作,考研也好,工作也罢,都是服务于自己的目标. 问题答应 ...
 - java第一次作业0
		
lsl321 java第一次作业 #1. 本章学习总结 你对于本章知识的学习总结 本章我们学习了各种java相关文件的使用,以及码云,博客,pat等程序辅助软件,这些对于我们专业的学习有非常大的帮助, ...
 - 北京工业大学耿丹学院2016下C作业学习总结
		
北京工业大学耿丹学院2016下C的班级地址在https://edu.cnblogs.com/campus/bjgygd/Sixteen-One . 第一次作业:两部分 第一部分:新建博客,书写第一篇随 ...
 - C程序第一次作业
		
1-1 计算两数的和与差 1 设计思路 (1)主要描述题目算法 第一步:利用指针psum接收sum的地址,指针pdiff接收diff的地址,因此 * psum为sum, * pdiff为diff. 第 ...
 - OO第一次作业总结
		
OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...
 - 构建之法助教园地第一次作业--点评<西北师范大学|李晓婷>
		
一 博客点评 第一次作业--准备篇:https://www.cnblogs.com/Mookiepiece/p/10464606.html#4192515 点评内容: 首先,你对电脑很感兴趣,兴趣就是 ...
 
随机推荐
- java并发编程(十二)----(JUC原子类)数组类型介绍
			
上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray.其中前两个的使用方 ...
 - JS中map()与forEach()的区别和用法
			
相同点: 1.都是循环遍历数组中的每一项 2.每次执行匿名函数都支持三个参数,参数分别为item(当前每一项),index(索引值),arr(原数组) 3.匿名函数中的this都是指向window 4 ...
 - android ——活动的生命周期
			
在其生命周期内,activity在运行.暂停和停止三种可能的状态间进行转换,不同状态之间互相转换的时候的调用不同的方法,重写这些方法就能在活动切换,被销毁时保存或传输数据,在被启动.被切换出来时接收数 ...
 - JMeter的JTL大文件解析
			
1.背景 不知大家在使用JMeter工具进行性能测试时,是否遇到过JTL结果文件过大导致GUI页面长时间解析无响应的问题.这种情况往往出现在稳定性测试场景下,此时的JTL文件大小可能已经达到G级别了. ...
 - (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅
			
字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...
 - 初学html总结
			
2019-08-17 17:58:49 html:超文本标记语言,用于网页结构的搭建 html语言构成:由标签.属性.属性值构成 标签:" < "后面第一个单词 属性:标签后 ...
 - 蓝桥杯c语言基础题
			
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...
 - SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
			
1. activemq 首先引入依赖 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId& ...
 - centos6.8启动防火墙的艰辛过程
			
首先我的/etc/sysconfig/iptables文件没有. 解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptab ...
 - Spring学习之旅(六)--SpringMVC集成
			
对大多数 Java 开发来说,基于 web 的应用程序是我们主要的关注点. Spring 也提供了对于 web 的支持,基于 MVC 模式的 Spring MVC 能够帮助我们灵活和松耦合的完成 we ...