用幻灯片讲解C++中的C语言风格数组

用幻灯片讲解C++中的C语言风格数组

1.栈内存中的C风格数组

  • 糟糕的可用性,但你将在遗留代码中看到它们。
  • 相同类型的对象块。
  • 大小必须是常量表达式。
  • 第一个元素的索引为0,即数组索引从0开始。
    注意一下数组的初始化,使用了C++11标准之后的统一初始化,即用花括号初始化变量的方法。

2.C风格数组的指针

更奇怪的是:数组标识符退化为指向第一个元素的指针。

这句话啥意思呢,以下图为例,数组numbers的标识符是numbers,可以单独使用它,使用它时,它退化成了此数组第一个元素的指针。

即:numbers = &numbers[0]

3.数组存取

给数组元素赋值的两种方法。

4.堆内存中的C风格数组

  • 相同类型的对象块。
  • 数组大小可以在运行时设定。
    第一点和栈内存数组一致,就是说所有元素类型必须一致。第二点和栈内存数组不同,在栈中数组的大小是常量表达式也就是在编译时就确定的,而堆中的数组是可以在程序运行时动态设定的。比如下图的数组个数是3,也可以是其它大小或大于0的整形表达式、变量等。make_unique模板函数是创建一个现代C++使用的唯一型智能指针。

5.向函数传递C风格数组

  • 数组标识符退化为指向第一个元素的指针
  • 问题:我们怎么知道数组的大小?
    注意:你是用double* x传递数组参数,还是用double x[]传递数组参数,两者没有不同实际都是退化为指针传递。

    要知道向函数传递的数组参数的大小,C语言的典型的解决方法是再传递一个数组大小参数。

6.用STL库的copy算法复制数组

一种是使用数组索引复制,一种是使用迭代器复制。

使用迭代器的好处是:你不用关心数组的大小,只作用于数组标识符本身(而不是指针)!

7.为什么要避免C风格数组

  • 不可深拷贝、可分配。(意思是,C风格数组标识符赋值给变量只是赋值了指针而无法进行深拷贝赋值,可分配的意思是在堆中创建C风格数组使用指针变量方式指向数组,指针变量是可以被再使用分配别的内存的,这时如果原内存没有释放则会造成内存泄漏。)
  • "退化"为指向第一个元素的指针。
  • 数组自己不知道大小。
  • 传递给函数不安全。

8.C语言风格的字符串

  • C风格的字符串是字符型的数组。
  • 字符串数组以'\0'字符作为结束,"\0"字符的值为0。
  • 字符串文本(字面值)"xyz"的类型是char const [ ] (只读字符串数组)

    原文链接 原文
相关推荐
岁忧15 分钟前
(nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)
java·c++·算法·leetcode·go·散列表
我要成为c嘎嘎大王25 分钟前
【C++】类和对象(2)
开发语言·c++
慕y27440 分钟前
Java学习第九十一部分——OkHttp
java·开发语言·学习
海奥华21 小时前
操作系统到 Go 运行时的内存管理演进与实现
开发语言·后端·golang
C++ 老炮儿的技术栈1 小时前
在vscode 如何运行a.nut 程序(Squirrel语言)
c语言·开发语言·c++·ide·vscode·算法·编辑器
HKUST_ZJH1 小时前
交互 Codeforces Round 1040 Interactive RBS
c++·算法·交互
Y4090011 小时前
Java基础——实现图书管理系统交互功能
java·开发语言·笔记·交互
沐知全栈开发1 小时前
MySQL 运算符
开发语言
寒水馨2 小时前
Java 24 新特性解析与代码示例
java·开发语言·新特性·jdk24·java24
talented_pure2 小时前
Python打卡Day30 模块和库的导入
开发语言·python