• 【C++程序员必修第一课】C++基础课程-04:变量、常量和指针


    1 本课主要内容:

    • 变量及变量类型
    • 变量作用域(变量生命周期):全局作用域、类作用域、块作用域、局部作用域
    • 常量和引用
    • 指针

    2 主要知识点:

    • 变量是什么?

    变量就是程序中用于存储数据的一个名称,通过变量来表示不同的对象,比如有用户1和用户2,如果需要表示该二个用户的名称,在程序里面就需要二个变量来存储,如下例子:

    1. const char* user1Name{"Yang Sir"}; // 用户1名称
    2. const char* user2Name{"Li Sir"}; // 用户2名称
    3. user1Name, user2Name 是变量名;数据类型是 const char*(字符串);
    4. user1Name 的值是 "Yang Sir";user2Name 的值是 "Li Sir"

    定义变量需要指定变量数据类型,各种数据类型变量例子如下:

    1. #include
    2. /************************
    3. * 各种数据类型变量示例
    4. *************************/
    5. // 布尔型
    6. bool isEnabled{true}
    7. bool isDisabled{false}
    8. // 字符型
    9. char inputChar1{'A'};
    10. unsigned char inputChar2{'A'};
    11. wchar_t inputWChar{'A'};
    12. // 字符串
    13. std::string fileName;
    14. char filePath[260]{""};
    15. // 整形
    16. short number1{0};
    17. unsigned short number2{0};
    18. int number3{0};
    19. unsigned int number4{0};
    20. long long number5{0};
    21. unsigned long long number6{0};
    22. // 浮点型
    23. float inputNumber1{0.0};
    24. double inputNumber2{0.0};
    25. // 枚举类型
    26. enum ColorType {
    27. COLOR_UNKNOWN // 0:示知类型
    28. , COLOR_RED // 1:红色
    29. };
    30. ColorType colorType = ColorType::COLOR_RED;
    31. // 结构体
    32. struct FileInfo
    33. {
    34. char fileName[260]; // 文件名称
    35. char filePath[260]; // 文件路径
    36. unsigned long long fileSize = 0; // 文件大小
    37. };
    38. FileInfo fileInfo;
    39. // 类
    40. class UserInfo
    41. {
    42. public:
    43. std::string m_userName; // 用户名称
    44. int m_userAge{0}; // 用户年龄
    45. };
    46. UserInfo userInfo;
    47. // 指针
    48. UserInfo user1;
    49. UserInfo* userPointer = &user1;
    50. int age = 0;
    51. int* agePointer = &age;
    52. // 数组
    53. int ageList[10];
    54. FileInfo fileList[10];

    变量作用域:全局作用域、类作用域,局部作用域,块作用域

    1. /***************************************************************
    2. * 变量作用域示例:全局作用域、类作用域,局部作用域,块作用域
    3. ***************************************************************/
    4. // 全局作用域:变量定义在任意{}外面,生命周期全局有效
    5. int theFileSize{0};
    6. // 类作用域:class类成员变量,类生命周期内有效
    7. class CarInfo
    8. {
    9. public:
    10. std::string m_carName;
    11. };
    12. // 局部作用域,块作用域:生成周期在指定{}内部
    13. void lesson3_test()
    14. {
    15. // minValue,maxValue 生命周期在lesson3_test()函数内局部【局部作用域】有效
    16. unsigned int minValue = -1; // 最小值
    17. unsigned int maxValue = 0; // 最大值
    18. std::random_device rd;
    19. for (int i = 0; i < 100; i++) {
    20. // value 生命周期在 for循环代码块【块作用域】内有效
    21. unsigned int value = rd();
    22. std::cout << i << " : " << value << std::endl;
    23. if (value < minValue)
    24. minValue = value;
    25. else if (value > maxValue)
    26. maxValue = value;
    27. }
    28. }
    • 整数的三种表示形式

    整数的三种表示形式:十进制、八进制和十六进制;

    1. /****************************************************************************************
    2. * 整数有三种表示形式:十进制,八进制,十六进制
    3. * 十进制:除表示正负(+ -)符号外,以数字1~9开头,由数字0到9组成组成;如 127,+126,-376
    4. * 八进制:以数字0开头,由0~7组成的数;如 0215,03240
    5. * 十六进制:以0X或0x开头,由0~9,A~F(或a~f)组成;如 0x1024, 0x2408a0
    6. ****************************************************************************************/
    7. // 整数常量示例
    8. int n1 = 600; // 十进制
    9. int n2 = 0600; // 八进制
    10. int n3 = 0x60f; // 十六进制
    • (const) 常量

    常量是指固定不能修改的值;

    1. // 如下例子:10和10.1是数值常量;
    2. // inputNumber1, inutNumber2 是常量变量
    3. const int inputNumber1{10};
    4. const float inputNumber2{10.1};
    • (&) 引用变量(可读可写)

    1. /***************************************************************
    2. * 引用示例;
    3. * aliasValue1是一个引用变量,指向value1变量
    4. * value1的值修改,aliasValue1的值也会跟着一起修改
    5. * 反过来,修改aliasValue1的值,value1的值也一样跟着修改
    6. ****************************************************************/
    7. int value1 = 100;
    8. int& aliasValue1 = value1;
    9. value1 = 200; // 引用变量 aliasValue2 的值 也跟着改变
    10. aliasValue1 = 10; // 变量 value1 的值也跟着改变
    • (const type&) 常量引用(只读不能写)

    1. /***************************************************************
    2. * 常量引用示例:
    3. * aliasValue2,aliasValue3.aliasValue4都是常量引用
    4. ****************************************************************/
    5. int value2 = 100;
    6. const int value3 = 100;
    7. const int& aliasValue2 = value2; // value2变量的值改变,aliasValue2的值也会跟着一起改变
    8. const int& aliasValue3 = value3;
    9. const int& aliasValue4 = 100;
    • 指针

    • 普通指针变量用 (new) 来创建,如 (int * p = new int{0};); 对应需要用 (delete) 来删除,如 (delete p;)

    • 创建指针数组例子:int * p = new int[10],对应用 (delete[] p)来删除,如 (delete[] p;)

    • 用 (&value) 来取普通变量指针地址,如 (int v{100}; int * p = &v;)

    • 内置基础类型变量指针用 (*p) 来访问指针指向的变量,如 (const int v2 = *p; ) 或者 (*p = 200;)

    • 用户自定义类型(如struct ,class)使用 (p->) 来访问对象

    • (this->) 是对象内置指针,用来访问对象 (如 class 类) 本身

    1. // 普通指针变量
    2. int * p = new int{0};
    3. delete p;
    4. // 指针数组
    5. int * parray = new int[10];
    6. delete[] parray;
    7. void* p1{nullptr}; // 无类型指针
    8. int v = 100;
    9. int * p2 = &v; // 指向整数的指针
    10. *p2 = 200; // v 的值会跟着改变
    11. double f = 1.34;
    12. double * p3 = &f; // 指向浮点数的指针
    13. *p3 = 2.68; // f 的值会跟着改变
    14. class MyInfo {
    15. public:
    16. void set_data(int v) {
    17. this->m_value = v; // this->指针
    18. }
    19. int get_data() const {return this->m_value;}
    20. public:
    21. int m_value{0};
    22. };
    23. MyInfo * info1 = new MyInfo();
    24. info1->a = 100; // 用 (p->) 访问对象成员变量
    25. info1->set_data(100);
    26. delete info1;

    3 一些建议:

    • 需要清楚知道不同变量类型对应的取值范围(最大、最小数),如 int 的取值范围是 -2147483648 到 2147483647,而 unsigned int 的取值范围是 0 到 4294967295;
    • 业务场景选择合适的变量类型;比如需要计算很大的整数,需用到64位的 long long 长整数,明确没有负数的用 unsigned 等等;
    • 养成变量定义就地初始化变量值的习惯,如下例子:
    1. void * nameAddress{nullptr}; // 推荐
    2. bool isAllowed{true}; // 推荐
    3. int minNumber{0}; // 推荐
    4. int minNumber; // 不推荐

    4 课后练习:

    • 练习1:设计一个用户信息数据类(class UserInfo),想象下一个用户信息数据类至少会包含哪些字段?如用户名称、年龄、性别等;然后选择适合的类型定义成员变量;
    • 练习2:随机生成50个用户模拟数据并打印到屏幕上;

    附录:在线视频课程

    进入视频号学习本文配套视频课程。

    -【End】-

    哈喽,大家好!我是喜欢coding的小二,一枚“靓仔又不掉头发”的C++开发大头兵;欢迎围观公众号(20YC编程),定期会分享一些技术开发经验、行业资讯、业界动态等。期待您的关注,一起交流学习进步。

    #下载示例源码和开发工具,请进入公众号首页,点击(发消息)最下方的(资源下载)菜单即可获取。

    喜欢本文章,记得点赞、分享、关注哦~

  • 相关阅读:
    Redis8 实现分布式锁
    JAVA--类的继承
    C 标准库 - <math.h>和<setjmp.h>详解
    LeetCode刷题日记003——无重复最长子串
    升级pip 升级pip3的快速方法
    【非技术】对自己接到工作任务时的一些提醒
    DJ12-1 8086系列指令系统-2 数据传送指令
    leetcode-每日一题-1758-生成交替二进制字符串的最少操作数(简单,数学思想)
    初识 Jenkins 持续集成
    【项目】图书管理系统
  • 原文地址:https://blog.csdn.net/yanghz/article/details/133805649