北京邮电大学2017菜鸟指针学习笔记

概念理解辨析

指针概述

指针是一种数据类型,它的值表示内存地址,指针数据类型声明的变量是指针变量,使用指针变量可以对内存空间进行操作。在C中,对内存空间的访问有两种访问方式,直接访问和间接访问。

·直接访问和间接访问

1.直接访问
按照C的方式,如果定义一个变量,系统会给这个变量分配一块内存,变量有两个属性,变量值变量地址。变量地址指示了该变量在内存中的存储位置,变量值是这块内存中的内容。要访问这块内存空间上的内容,可以直接使用变量名
2.间接访问
间接访问的含义是先从其它内存空间获得要访问的内存地址根据得到的地址访问目的地址

·指针的定义和初始化

int *pal1,*pal2;
    char *pa1,*pa2;
    //说明:指针变量的类型就是它所指定的地址单元中存放的数据类型
    //pal1,pal2的类型是(*int)型,即指向整型变量的指针。pal1,pal2所指定的地址单元中只能存放整型数据

·指针初始化:(指针变量必须在初始化后才能正确使用)指针变量在声明后,变量的值(地址)是随机的,其中的随机地址可能不是有效的数据地址,这样的指针变量使用并不安全
·空指针:定义指针时,若不确定指针的指向,就要给指针赋值为零(或NULL),表示空指针,不指向任何内存单元

char ch1='Y';
char *pach1=&ch1;
//定义指针时就进行初始化
char ch1='Y';
char *pch1=NULL;
pch1=&ch1;
//定义指针变量后用赋值的方式对它初始化

·指针的使用

char ch1='a';
*ph=0;
ph=&ch1;
cout<<*ph<<endl;

//当ph指针指向变量ch1后,访问*ph和ch1有相同的效果。改变*ph的值,也就是改变ch1的值,同样,改变ch1的值也就是改变*ph的值

·指针的算术运算

指针可以进行的算术运算只有加法和减法,但是指针的加减法和一般的加减法不同。
指针可以和一个整数相加减,含义是指向当前位置p的前方(后方)的第n个数据的地址
(指针的类型此时short *p,p-1移动两个字节;int *p,p-1移动四个字节)

//通过指针的间接访问输出下表为偶数的数组元素的值
int k[10]={1,2,3,4,5,6,7,8,9,10},*pk=0;
pk=&k[0];
for(int I=0;i<10,i=i+2)
cout<<"k["<<i<<"]"<<*(pk+i)<<endl;

指针与指针相加没有意义,不允许;
指针与指针相减,表示求出两个指针之间可以存放几个指定类型的数据

·指针的赋值运算

指针的赋值运算一定是地址的赋值。用来对指针变量赋值的可以是以下参量:
·同类型变量的地址
·同类型的已经初始化的指针变量
·向系统申请的同类型指针的地址

1.堆内存分配 :
C/C++定义了4个内存区间:
代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store)。
堆的概念:
通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;
有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。
当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。

2.堆内存的分配与释放
堆空间申请、释放的方法:
在C++中,申请和释放堆中分配的存贮空间,分别使用new和delete的两个运算符来完成:

指针变量名=new 类型名(初始化式);
delete 指针名;
例如:1、 int *pi=new int(0);
它与下列代码序列大体等价:
2、int ival=0, *pi=&ival;
区别:pi所指向的变量是由库操作符new()分配的,位于程序的堆区中,并且该对象未命名。

·动态内存

动态内存是在程序执行时才可以申请、使用、释放的内存,即存放动态数据的内存区域。
动态内存不能通过变量名来使用,只能通过指针来使用
在实际应用中,有两种情况需要使用堆内存:
(1)需要存储大量数据时,一般申请使用堆内存。
(2)如果需要存储一组数,数据类型相同但数据个数在编程时不确定,在运行时才能确定,这种情况无法定义数组,只能使用堆内存存储。

· C语言动态内存申请和释放

C语言通过函数malloc()申请动态内存,通过函数free()释放动态内存

void *malloc(unsigned int size);
int *pn=(int *)malloc(sizeof(int));
void free(void *pr);
· c++的动态内存申请和释放

c++通过运算符new申请动态内存
new<类型名>(初值)//“类型名”是所申请的内存将存放数据的类型,“初值”则是存放的数据初值,也就是可以将内存的申请和赋初值在一次操作中完成

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值