• 小Z的私人课(信息学奥赛课课通C++)——指针第一课:指针概念


    目录

    课前闲聊

    开始上课

    作者对指针的理解

    指针的概念

    指针的定义和使用

    指针的理解

    (1)指针的类型

    (2)指针所指向的类型 

    (3)指针的值 

    (4)指针本身所占据的内存区

    实践巩固

    课后作业

    第一题:数字变化

    课后闲聊


    课前闲聊

    大家好,这里是小Z,因为最近的一些纠纷,所以暂时没跟新,但是,现在,我回来了!!!废话不多说,我们直接来说一下这次的新系列——小Z私人课,那么,这个系列是为了那些没有买关于编程比赛备考书的兄弟们,所以大部分为书上内容,我也会在标题上说明素材来源,如果喜欢这些书,可以去购买,那么,话不多说,进入这节私人课吧!!!

    开始上课

    作者对指针的理解

    指针是C++语言的一个重要概念,也是C++语言的重要特色。C++语言的高度灵活性及极强的表达能力,在很大程度上表现在巧妙而灵活的运用指针。通过指针可以有效地表示复杂的数据结构;能够方便地处理数组和字符串;能够动态地分配内存,直接对内存地址进行操作;利用指针作为函数参数,能够实现“一次函数调用,有多个返回值”的目的。因此,必须深入学习和理解指针的概念,体会和掌握指针的各种操作,熟练应用指针去实践编程。应该说,不掌握指针就没有掌握C++语言的精华。

    指针的概念

    我们知道,“int a=3;”就表示定义一个整型变量a并把它的值初始化为3。那么,系统就在内存的某个区域开辟4个字节的连续单元存放a。对a的读写就是对该内存区域的存取操作。但是,具体是哪4个单元,我们并不关心。内存单元的位置(编号)就叫做“地址”,可以通过取地址操作符“&”获得a的起始地址(首个存储单元的地址):&a。

    指针也是个变量。和普通变量不同的是,指针变量里存储的数据是一个内存地址,就好像一个指示器,指引着你去该内存地址开始的一块内存区域存取数据。

    指针的定义和使用

    指针变量的定义格式为:

    数据类型*指针变量;

    例如,“int*p=NULL;”表示定义一个指针变量p,p存放的是一个内存地址,这个区域存放的是一个整数。初始化为NULL(如果定义的是全局指针变量,则默认就是,可以省略),表示空地址(相当于整形变量初始化为0)。

    可以通过赋值语句给指针变量赋值,例如“p=&a;”表示把变量a的内存地址赋值给p。所以,可以通告p间接地操作a,这时,需要用到指针操作符“*”,即“*p”等价于a。

    指针的理解

    对于指针,要理解以下4个方面的内容:指针的类型,指针所指的向的类型,指针的值或者叫指针所指向的内存区域,还有指针本身所占据的内存区。

    (1)指针的类型

    从语法角度看,把指针定义语句里的指针名字去掉,剩下的部分就是这个指针的类型,也就是指针本身所具有的类型。

    1. int *ptr;//指针的类型是int *
    2. char *ptr;//指针的类型是char *
    3. int **ptr;//指针的类型是int **
    4. int (*ptr)[3];//指针的类型是int (*)[3]
    5. int *(*ptr)[4];//指针的类型是int *(*)[4]

    (2)指针所指向的类型 

    当通过指针来访问指针所指向的内存区域时,指针所指向的类型决定了编译器将把那片内存区域里的内容当做什么来看待。从语法上看,把指针定义语句中的指针名字和名字左边的指针声名符“*”去掉,剩下的就是指针所指向的类型。

    1. int *ptr;//指针的类型是int
    2. char *ptr;//指针的类型是char
    3. int **ptr;//指针的类型是int *
    4. int (*ptr)[3];//指针的类型是int ()[3]
    5. int *(*ptr)[4];//指针的类型是int *()[4]

    在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型和指针所指向的类型是两个不同的概念。

    (3)指针的值 

    指针的值是指针本身存储的数值,这个值将被编译器当做一个地址,而不是一般的数值。在位长32位的系统中,内存地址都是32位的,所以所有类型的指针都是一个32位整数。指针所指向的内存区域就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区域。我们说一个指针的值是X,就相当于说该指针指向了以X为首地址的一片内存区域。指针所指向的内存区域和指针所指向的类型是两个完全不同的概念。

    (4)指针本身所占据的内存区

    指针本身占了多大内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位的系统中,指针本身占据了4字节的长度。

    实践巩固

    1. 若有语句“int a=4,*p=&a”,下列均代表地址的一组选项是()。
    2. A a,p,&*a
    3. B *&a,&a,*p
    4. C &a,p,&*p
    5. D *&p,*p,&a
    6. 答案为D

    课后作业

    第一题:数字变化

    1. 【问题描述】
    2. 输入两个不同的整数,把较小的那个数翻倍并输出。
    3. 【输入格式】
    4. 一行两个整数(int范围之内),之间用一个空格隔开。
    5. 【输出格式】
    6. 一行一个整数,较小数翻倍后的结果。
    7. 【输入样例】
    8. 2 3
    9. 【输出样例】
    10. 4

    课后闲聊

    这节课他家听懂了吗?听懂就点个赞吧!!!课后作业我会发在下期的文章末尾。那么这期就到这了,这个系列有可能会替代理论课,但其实双方差距都不大,那么我就走啦,大家记得写作业哦,拜拜┏(^0^)┛!!!

  • 相关阅读:
    03 基础配置webpack3打包vue文件
    视频剪辑练习
    c++编译的四个阶段
    JS基础数据类型及判断
    金融数据合规管理研究
    【gradle】通过 toml 管理 classifier 的写法
    首次做CMMI,如何选择适合的评估级别
    督查督办管理系统在企业管理中起到的作用
    2022最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)
    Django-Multitenant,分布式多租户数据库项目实战(Python/Django+Postgres+Citus)
  • 原文地址:https://blog.csdn.net/zyxtjzys/article/details/127953720