4章 指针和引用

4.1指针定义与使用

  • 程序用到的数据和声明的变量就存放在一个个字节中
  • 不同类型的数据和变量占用是的字节数不同,如short型变量占用两个内存字节
  • 内存单元:某个元素占用的几个字节成为内存单元
  • 内存单元占用的字节数随其存储变量的不同而不同

通过“变量名”可以访问该变量对应内存单元,
实际上,我们还有可以直接通过“地址”来访问某个内存元素

4.1.1 声明一个指针变量是个双刃剑

指针是一种数据变量

和普通变量一样,在使用指针变量之前应该对指针变量进行声明
类型指针变量名://如intpNum;

“*”表明语句的是一个指针变量,类型指定了指针所指的内存单元的数据类型

提示:
可以将int*理解成一种复合类型,是指向int型数据的指针。

#include<iostream>
using namespace std;
int main()
{
    double num = 3;//声明一个double型变量
    double*pNum;//声明一个double型指针变量pNum
    pNum = &num;//用num的地址为pNum赋值
    cout << "pNum在内存中的位址是:" << &pNum << endl;
    cout << "pNum的值为:" << pNum << endl;
    cout << "num在内存的地址为:" << &num << endl;
    cout << "可以使用指针访问num:" << *pNum << endl;//输出指针pNum占据的内存大小
    cout << "pNum(指针类型)在内存中的字节数:" << sizeof(pNum) << endl;
    //输出double变量num占据的内存大小
    cout << "num(double型)在内存中的字节数" << sizeof(num) << endl;
    return 0;


}
pNum在内存中的位址是:008FF9A4
pNum的值为:008FF9B0
num在内存的地址为:008FF9B0
可以使用指针访问num:3
pNum(指针类型)在内存中的字节数:4
num(double型)在内存中的字节数8
  • *pNum相当于num变量,是间接访问方式
  • &num相对于pNum,num的地址
  • &(*pNum)相当于&num,num的地址
  • (&num)相当于pNum ,变量num

4.1.4 指针赋值

  • C++允许同类型的指针之间赋值
#include<iostream>
using namespace std;
int main()
{
    short num1 = 100, *pNum1 = &num1;
    //声明一个short类型指针,并用short变量Num1的地址给初始化
    long*pNum2 = (long*)pNum1;//强制转换用pNum1位long型的pNum2赋值
    cout << "pNum1的地址:" << &pNum1 << endl;
    cout << "pNum2的地址:" << &pNum2 << endl;
    cout << "pNum1的内容:" << &pNum1 << endl;
    cout << "pNum2的内容:" << &pNum2 << endl;
    cout << "pNum2指向的值为:" << *pNum2 << endl;
    return 0;
pNum1的地址:006FFEBC
pNum2的地址:006FFEB0
pNum1的内容:006FFEBC
pNum2的内容:006FFEB0
pNum2指向的值为:-859045788

4.2 指针的运算

1.指针与整数的加减
指针与整数的加减,表示指针在内存空间向上或向下移动整数个单位内存,

  • (单位是多少内存字节取决于指针所指变量的类型。)
  • 例如,short型指针每次移动两个字节,double型指针每次移动8个字节。

指针变量进行加N运算:
指针变量新值=指针变量当前+N*指针所指类型占用的内存字节数
2.同类型指针间的比较
3.同类型指针相减
公式计算:
(指针1的值-指针2的值)/指针所指变量占用的内存字节数.
4.3动态内存分配

  • 在C++中允许程序员用创建(new)和删除(delete)两个运算符对内存进行动态分配。
  • 在程序运行时申请一块没有命名的内存来存储变量或者更复杂的数据结构,并把改内存的首地址记录下来,以备将来访问。
  1. 使用new动态分配内存。
    为一个变量分配动态的内存的基本格式
    类型名*指针变量名=new类型名
    其中的“new类型名”通知编译器:需要开辟的内存是用来存储的值是什么类型,
    new操作符能根据这个类型名来自动计算要分配的存储空间的大小。
    int*pNum=new int
    2.使用delete动态释放动态申请的内存
  • 动态申请的内存,使用后归还给系统,以供其他程序使用。
    基本格式:
    delete指针
  • 其中使用new动态申请的内存块,delete指令会释放动态申请的内存块,不会删除指针本身
    3.使用new申请动态数组
    基本格式
    类型名*指针变量名=new类型名[元素个数]
  • 和申请建立数组不同,使用new申请动态数组时,元素个数可以是变量,
    int i=5
    int*p=new int[i];//合法
  • 这样可以避免数组越界,将数组的维度设的大,造成内存的浪费。
    -提示:new无法对动态申请的数组存储区进行初始化,
    -对于动态申请的数组,在使用过,应delete[]命令将内存释放,基本结构:
    delete[]指针
    -方括号在告诉,应释放整个数组,而不是指针指向的元素。
//使用new申请动态数组OperatorNew
#include<iostream>
using namespace std;
int main()
{
    int num = 0;
    int i;
    cout << "请输入数组个数:" << endl;
    cin >> num;
    cout << "请依次输入" << num << "个整数(用空格隔开):" << endl;
    //申请一块可存放num个int型数据的动态内存,将首地址赋值给指针
    int*pSz = new int[num];
    for (i = 0; i < num; i++)
        cin >> pSz[i];//for语句为动态数组中的元素赋值
    for (i = 0; i < num; i++)
        cout << "第" << i << "个数为:" << pSz[i] << endl;
    delete[]pSz; //释放动态内存
    return 0;
}
请输入数组个数:
4
请依次输入4个整数(用空格隔开):
12
23
12
45
第0个数为:12
第1个数为:23
第2个数为:12
第3个数为:

4不要使用或释放已经释放的内存块

  • 被delete释放的内存块,没有意义了。
    5.使用malloc和free动态申请和释放内存
    下次再看这里马一下
    6.动态内存申请并不一定成功
  • 一旦失败,标识符new和malloc()函数会返回空指针。
  • 考虑程序就会崩掉的危险,在使用动态申请的内存块时,应该首先判断申请是否成功(指针是否为null)
char*pC!=new char[];
if(pC!=null)//执行操作
else//内存申请失败处理
  • free()和delete()一个指针后,该指针所执行的动态内存被释放,但指针的值并发生变化,常称此时的指针为“野指针”。通常,在内存释放后,将指针赋值为null,这样便不会再次释放已经释放了的内存,并且,通过“if(指针!=null)”也可以进行防错。

4.4指针和const

const在不同位置可以达到三个目的:

  • 禁止对指针赋值
  • 禁止通过间接引用(*指针)对指针所指的变量赋值
  • 即禁止对指针赋值,又禁止通过禁止通过间接引用(*指针)对指针所指的变量赋值
    1.禁止对指针赋值
int x = 0;
int*const pInt = &x=
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,300评论 0 6
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 2,697评论 0 73
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,007评论 0 12
  • - 01 - 和别人吵了架。 左先生:别生气了,生气伤身体。 右先生:我劝你吃点折耳根冷静一下。还去上次那家? 加...
    罗掌柜real阅读 522评论 0 0