你好, 欢迎回来｡
我们在一个新的部分｡ 此部分被命名为指针｡
这可能是本课程最重要的部分｡
这也可能是课程中最难的部分｡
指针和c的概念是一个非常棘手的概念｡
但我们要慢慢地过｡
我们会提供很多讲座, 一步一步来｡
我们将从最高级别开始, 深入到越来越多的细节｡
如果你想充分利用c语言, 你必须理解指针｡
所以这很重要｡
因此, 让我们从顶部开始, 讨论间接寻址的概念,
它本质上与指针的概念相同｡
因此指针与间接寻址的概念非常相似｡
你在日常生活中使用间接法｡
例如, 如果我描述间接的意思,
就像你必须买新的东西, 你公司的新产品｡
例如, 假设您必须为打印机购买新墨盒｡
如果你在一家大公司工作, 你可能会做的是,
你必须通过某个部门购买任何新的采购｡
所以你可能会去采购部｡
你可能会打电话给采购部门的人, 让他们为你订购新的墨盒｡
这将是他们的工作,
然后找到一个当地的商店, 提供实际的项目, 你想要订购｡
这意味着你不能自己去订购｡
你在请求别人帮你做这件事｡
然后通过他们的专业知识和他们对谁拥有库存中的产品的了解, 他们会把它还给你｡
所以这是一个关于你的间接层次｡
你不能直接去商店买｡
你去采购部门, 这个人的部门知道它会为你做所有的事情｡
这与编程中的指针概念相同｡
在编程语言中, 间接指的是使用名称､
引用或容器而不是值本身来引用某物的能力｡
我们通过使用变量名来使用交互形式｡
我们不使用内存地址来访问数据｡
我们使用变量名｡
间接寻址最常见的形式是通过其内存地址操作值｡
因此, 除了使用变量名来表示内存地址的间接寻址的一个非常小的描述之外,
还可以使用地址本身通过其内存地址来操作值｡
地址本身｡
因此, 指针提供了一种访问特定数据项的值的间接方法｡
它是一个变量, 其值是一个内存地址,
这一点非常重要｡
到目前为止, 我们已经学习了包含特定类型数据的变量, 如数字､
字符､
双精度数､ 有理数浮点数｡
现在我们将有一个不存储任何此类数据的变量｡
数据存储的类型是存储器地址｡
内存地址将被表示为一个整数,
一个十六进制数, 但它仍然是内存地址｡
所以它是一个地址的值, 如果它是一个现有的变量, 或者是一个动态分配的新位置,
那么它就是内存的另一个位置｡
因此, 正如通过采购部门订购新墨盒是有道理的一样,
您不必知道墨盒是从哪个特定的商店订购的｡
也有很好的理由来解释为什么使用指针和c来使用这些变量来表示一个地址, 一个内存地址｡
我们在课程一开始就讨论了内存地址｡
无论何时你运行一个程序, 你创建变量, 这些变量都存储在内存中｡
且该存储器具有特定地址｡
你必须知道地址才能取回数据, 就像你需要知道房子的地址, 如果你要开车去某个地方或者某个位置的地址｡
因此在程序中使用指针是c语言中最强大的工具之一｡
这就是为什么理解它是重要的｡
任何实质性的c程序都将使用指针｡
所以你要理解这个概念｡
对于那些已经编写了像java或c sharp这样的现代语言的程序员来说, 你不必担心这个问题,
因为所有的内存分配和指针都没有真实的概念｡
即使在底层, java也使用指针, 因为它们有引用的副本｡
这是同一种概念｡
但是在c语言中, 你显式地有一个代表地址的变量｡
指针也是c语言中最令人困惑的概念之一｡
它们往往被滥用它们往往不被完全理解, 尤其是被新的程序员｡
所以重要的是, 你在开始的时候就弄清楚这个概念, 并且当你进入到越来越高级的c语言和越来越高级的指针概念时,
对发生了什么有一个清晰的概念｡
所以如果你一开始不明白, 学习,
学习, 学习, 练习用指针写代码｡
编译器必须知道它所指向的变量中存储的数据类型｡
所以它就像一个常规变量, 你必须在创建指针的时候指定数据类型｡
编译器需要知道这一点的原因与变量的原因相同,
它需要知道要分配多少数据, 即使你指向一些数据｡
每个指针都将与一个特定的变量类型相关联｡
它只能用来指向该类型的变量, 我们在讨论定义指针时会给予一个例子.
因此,
例如, 指向它的指针类型的指针只能指向int类型的变量｡
同样,
变量有一个地址值, 这就是指针｡
该地址可能包含内存中某个位置的值｡
指向float的指针类型的指针只能指向float类型的变量｡
这里有一个说明性的想法, 它给你一个指针的概念｡
不要担心这里的语法｡
我们在前面的课上已经简单的讨论过了, 这个[]号和这个星号, 你们不必担心｡
我想让你们注意的是, 指针是如何有地址的, 而地址可以包含一个值,
但在内存的其他地方.
在这个例子中, 我们创建了一个普通的数字,
我们已经创建了一百万次了, 然后你会看到这个语法, 星号表示它是一个指针｡
我们将详细讨论这一点｡
您还可以看到&符号, 表示它是地址｡
所以在这个例子中, 当我们创建int, p, number类型的指针时,
我们在赋值一个地址. 因为请记住, 指针只能存储地址｡
它在内存中的布局是, 变量名为number,
number的值为99.
Number在内存中也有一个地址｡
内存中的该地址就是指针的值｡
所以p是一个指针, 指向地址1008｡
1008的值为99, 也包含了变量编号｡
这就是我们要说的｡ 如果这是不清楚的,
你需要看看这个一个小时, 并确保你理解它｡
同样, 指针是一个指向地址的指针,
它存储的是地址｡
然后你就可以使用特定的语法访问这个地址中的值｡
那么为什么要使用指针,
为什么要提出这个概念, 为什么我们不能使用现有的数据类型, 当我们想使用字符串时, 使用字符数组｡
仅仅通过变量访问数据是非常有限的｡
使用指针, 你可以访问任何位置, 你可以把内存的任何位置作为一个变量,
例如, 然后你可以用指针来执行算术,
这使得事情变得更容易｡
c中的指针使数组和字符串的使用变得更容易,
我们也将学习这一点, 这是使用指针的另一个优点｡
指针允许您引用具有多个位置的同一空间和内存｡
这意味着你可以在一个位置更新内存, 然后在程序的另一个位置可以看到这个变化｡
这是一种使用全局数据的方法, 但仍然有封装的内部函数｡
您还可以通过共享数据结构中的组件来保存大量的内存空间｡
所以记住, 当c被发明的时候, c是在70年代被发明的｡
c的想法是非常有效和低水平｡
通过指针直接访问内存的想法非常有效, 而且速度也非常快｡
指针还允许函数修改作为变量传递给它们的数据｡
这是以传址方式传递｡ 我们要就此开个讲座｡
在这里, 您可以使用指针将参数传递给函数｡
然后在函数内部, 当您更改数据时,
更改将反映在函数外部｡
所以我们不再需要使用全球数据｡
我们可以使用函数内部的数据, 将该数据作为指针传递,
然后分配该函数外部的数据｡
所以它没有使用全局变量的缺点,
在全局变量中, 所有的东西都是紧密耦合的, 你可以把它限制在只需要知道数据的函数上｡
正如我提到的, 它还可以用来优化程序,
使其运行更快, 使用更少的内存, 这是一个重要的概念,
特别是在嵌入式真实的程序中｡
指针还允许我们从一个函数中获取多个值｡
我们已经讨论了如何传递数据函数的函数｡
我们还讨论了如何返回数据｡
我们知道, 现在一个函数只能返回一个值｡
但如果使用指针, 实际上可以从函数返回多个值｡
我们要谈谈这个问题｡ 这是一个很大的优势｡
我们还将讨论动态内存分配｡
现在, 当我们为程序创建内存时,
它是由编译器在声明变量时隐式完成的｡
例如, 如果您声明一个int变量, 它会自动为该变量创建4个字节｡
当您使用数组并指定数组的大小时,
会在编译时期配置该大小｡
所以如果你试图存储更多的数据, 你就完蛋了, 你的程序将无法工作｡
但是如果你有能力在运行时创建你所需要的那么多内存, 那将是巨大的｡
而指针可以让你做到这一点｡
它们允许您在运行时动态创建内存, 进行内存分配｡
我们也会谈到这一点｡
指针允许我们设计和开发更复杂的数据结构｡
而数据结构是存储数据的东西｡
数据结构的例子是堆栈提示或链接列表｡
我们可以用指针更容易地创建它们｡
指针提供直接内存访问, 同样, 高效快速｡
所以指针将是一个大概念｡ 我们会有很多关于指针的讲座｡
我希望你们集中注意力, 我希望你们在谈论这些概念的时候注意力集中,
因为这对于理解c编程语言是非常重要的｡
祝你好运, 我们开始吧｡ -谢谢—谢谢