第八章 指针

第八章 指针

2.  用指针来保存地址

☆指针就是保存内存地址的无符号整数变量

指针,是一个无符号整数(unsigned
int),它是一个以当前系统寻址范围为取值范围的整数。32位系统下寻址能力(地址空间)是4G-byte(0~2^32-1)二进制表示长度为32bit(也就是4B)。64位系统下寻址能力(地址空间)是8G-byte(0~2^32-1)二进制表示长度为64bit(也就是8B)。

int a=1;

int *p=&a;等价于int  *p;p=&a;

1.  空指针

将一个没有赋初值的指针delete,将会出现系统崩溃

☆定义指针后必须要对其初始化,或被赋值int *p=NULL;

0(NULL)既能是int型也可以是地址类型 int *型 所以0常常用于指针的初始化int
*p=0;此时的0代表地址为00000000的地址,并且这个地址不存储任何数据。我们大可以对它进行任意的操作。

4.  指针与类型

不能将不同类型指针(地址)相互赋值

6.  容易混淆的概念

p的值(p)≠p的地址(&p)

一个是存储的别人地址一个是自己的地址

7.  指针对数值的操作

typedef unsigned short int ut;

8.  更换指针保存的地址

和变量一样指针也可以更换其保存的地址

☆9.1.  为什么使用指针

1.处理堆中存放的大型数据

2.快速访问类的成员数据和函数

3.以别名的方式向函数传递参数(按址传递①改变实参的值②得到多个返回值)

堆中数据的优点:

①安全(只能通过指针来访问这些匿名的数据)②程序员可以控制这些数据的寿命

9.4.  指针与堆

9.5.         用指针删除堆中空间

☆声明了一个堆内存,就必须记得将他释放!

一般来说用于指向堆中内存的指针是个局部变量(存储在栈中),在程序结束并返回时,该指针就会自动消失。如果不提前delete或转移该地址,就会出现内存泄露(即内存遗落)

#include <iostream>

using namespace std;

int main()

{

int *p=new int;//堆的申请

*p=3600;

cout<<*p<<endl;

delete p;

cout<<*p<<endl;

//delete p;//连着两个delete系统就会崩溃,这是因为p指针指向的内存已经释放,再次释放就会导致系统崩溃

p=0; //必须使用,delete之后的未知堆中数据容易出错 注意
这个不是赋值而是将变量p的设为空指针(此处没体现这个必要性,但这是一个习惯,必须要养成)

p=new int;

*p=8;

cout<<*p<<endl;

delete p;

return 0;

}

10.  内存泄露

int *p=new int;

p=new int;(编译器不会报错)

delete p;//必须使用,否则就内存泄露,在使用new以后,不再使用该块内存空间,那么一定要用delete来释放它

11.  在堆中创建对象

Human *p=new human

12.  在堆中删除对象

13.  访问堆中的数据成员

☆(*p).get();等价于p->get();

14.  在构造函数中开辟内存空间

15.  对象在栈与堆中的不同

对象在栈中有析构函数自动释放内存,

对象在堆中要程序员手动释放该内存。

16.  this指针

this指针 就是系统自动创建的指向对象的指针

☆17.  指针的常见错误

delete p  与 p=0 必须一起用

delete p后告诉编译器两件事:①p成了迷途指针②p指向的内存已被释放。  
但是该p仍然指向这块内存,如果该内存被其它指针使用再次操作该p就会改变这个该内存的值

18.  指针运算 (即指针保存的内存地址的运算)

指针只能p++、p- -、p=p-2、p1=p2、*p=p1-p2(结果不是地址,是一个值,是两个内存地址的差)、P1>P2。

注意:因为开辟的内存不会自己改变,所以改变指针p后,p就不在指向这个内存空间。

19.1.  常量指针

int * const p (p的值不能改变,此时p只能被初始化不能被赋值)

目的在于将p与对象绑定

19.2.  指向常量的指针

Const int *p

目的在于将p绑定的对象设为常量

19.3.  指向常量的常指针

Const int * const p

目的在于将p与对象绑定并且将对象设为常量

以上操作都没有涉及到&p!!!

本章总结:

1.  指针是保存内存地址的变量(指针,是一个无符号整数(unsigned int))

int     
a=1;                   
等价于             
int    a=1;

int*  
p;                                                   
int*  p=&a;

p=&a;

2.  ☆指针从出现到消失,都要绑定一个已知对象的地址

一般情况下,指针常与NULL(0)地址为00000000的空间绑定;p=0;/p=NULL;

3.  为什么要使用指针

①   处理堆中大型数据

②   快速访问类的成员函数和数据

③   按址传递①改变实参的值②得到多个返回值

4.  堆中数据的优点

①   安全(只能通过指针访问)②可以随时控制这些数据的寿命

5.  在堆中创建对象

human*     p=new human;

创建一个human对象并且将地址传给p,     *p就是该对象;

☆(*p).get();       
等价于     p->get();

6.  this指针:每个对象都有一个系统自创的this指针

7.  ☆delete  p 。告诉编译器两件事①p指向的空间被释放②p成了迷途指针

8.  指针运算。(由其类型而定)

指针只能:p++,p--,p=p-2,p1=p2,*p=p1-p2,p1>p2

☆指针的值改变后就不再指向原来的空间了

9.  int* const p;

int const *p;    
等价于     const int * p;

int const * const p;  等价于    
const int * const p;

int get()const{x=5;return x;}

时间: 2024-08-09 21:34:16

第八章 指针的相关文章

第八章 指针实验

C程序设计实验报告 实验项目:指针实验 姓名: 王雨晴 实验地点: 514物联网实验室 实验时间:2019年6月12日 实验项目 指针基础及指针运算 数据交换 字符串反转及字符串连接 数组元素奇偶排列 一.实验目的和要求 (1)掌握指针的概念和定义方法. (2)掌握指针的操作和运算 (3)掌握指针与数组的关系 (4)掌握指针与字符串的关系 (5)熟悉指针作为函数的参数以及返回指针函数 (6)了解函数指针 二.实验内容 实验练习一 8.3.1指针基础及指针运算 1.问题描述 定义一个整型指针变量p

第八章指针实验

第八次实验报告 实验项目:指针实验 姓名:廖云福 实验地点: 514物联网实验室 实验时间:2019年6月12日 实验项目 指针基础及指针运算 数据交换 字符串反转及字符串连接 数组元素奇偶排列 一.实验目的和要求 (1)掌握指针的概念和定义方法. (2)掌握指针的操作和运算 (3)掌握指针与数组的关系 (4)掌握指针与字符串的关系 (5)熟悉指针作为函数的参数以及返回指针函数 (6)了解函数指针 二.实验内容 实验一. 8.3.1指针基础及指针运算 1.问题描述 定义一个整型指针变量p,使'y

第八章指针实验报告

C程序实验报告 姓名:韦小闻     实验地点:第一教学楼514教室     实验时间:6月12日 实验项目 1.指针基础及指针运算 2.数据交换 3.字符串反转及字符串连接 4.数组元素奇偶排列 一.实验目的与要求 1.指针基础及指针运算 ●本实验旨在加强学生对指针数据类型的理解,熟悉指针的定义.通过指针间接访问变量. 2.数据交换 ●本实验旨在加强学生对指针类型作为函数参数传递的理解,通常将实参传递给形参时,有两种方式,即按值传递和按地址传递,其中指针类型参数即是按地址传递. 3.字符串反转

[转]C 语言指针的使用

第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何

C指针的解析

这是我从网上转载的一篇关于C指针的文章,方便自己以后回顾,自己添加修改部分内容 ,不对请指正 Attention:指针是指针变量 ,数组是指针常量 第一章 指针的概念  指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: (1)指针的类型 (2)指针所指向的类型 (3)指针的值或者叫指针所指向的内存区 (4)指针本身所占据的内存区. 先声明几个指针放着做例子: 例一: (1) int *ptr; (2) char *ptr; (3) i

实验十:指针(1)

一.实验内容 1.计算两数的和与差.要求自定义一个函数 void sum_diff( float op1, float op2, float *psum, float *pdiff ): 其中op1和op2是输入的两个实数,*psum和*pdiff是计算得出的和与差. 编写主函数,并在其中调用函数sum_diff(),试编写相应程序. 2.利用指针找最大值:要求自定义一个函数 void findmax( int *px, int *py, int *pmax ); 其中px和px是用户传入的两个

(转)c指针

转自:http://www.cnblogs.com/wchhuangya/archive/2009/12/24/1631121.html 这两天开始搞BREW了,用的是C的语法.上学时学过的C都还给学校了,无奈,只能研究下.现在转载一篇C语言指针篇. 第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声

实验十一:指针(2)

一.实验内容 1.冒泡法进行排序.要求自定义一个函数实现用冒泡法对整数数组进行简单排序.函数接口定义: void sort( int a[], int n ); 其中a是待排序的数组,n是数组a中元素的个数.该函数用冒泡法将数组a中的元素按升序排列,结果仍然在数组a中. 编写主函数,并在其中调用函数sort(),试编写相应程序. 2.在数组中查找指定元素:要求自定义一个函数 int search( int list[], int n, int x ); 其中list[]是用户传入的数组:n( n

C语言 笔记

第一章 概述 1. C语言的特点 ①语言简洁.紧凑,使用方便.灵活.共有32个关键字(也称保留字),9种控制语句. ②运算符丰富,共有34种运算符. ③数据结构丰富,数据类型有:整型.实型.字符型.数组.指针.结构体.共用体等. ④具有结构化的控制语句(如if-else.while.do-while.switch.for) ⑤语法限制不太严格,程序设计自由度大. ⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作. ⑦生成目标代码质量高,程序执行效率高. ⑧可移植性好. 2. C