你好, 欢迎回来｡
在这堂课中, 我想为我们之前的挑战提供一个演示,
那就是理解通过引用传递, 让函数中的参数接受指针｡
因此, 让我们创建一个新项目｡
我们称之为一个指针通过引用传递, 因为这就是它要演示的, 基本的东西,
新项目, 控制台应用程序｡
很简单｡
让我们把这个指针叫做下划线, 通过引用传递｡
同样,
演示如何在函数内部使用参数传递数据, 以及如何在函数外部修改数据｡
我们要做的第一件事就是创建函数声明, 函数原型.
这样做总是很好的, 这样你就可以在程序中的任何地方调用｡ 我们就扯平了｡
这个函数声明的主要内容是它要接受一个指针｡
它只需要一个结束指针, 我们只需要输入int,
星星, 然后你可以给它取任何你想要的名字, 最后用分号结束.
我们的主函数,
首先我们要做的是, 创建一个常规整型变量,
我们只需要输入int, num, 然后硬编码为9.
我们要做的就是调用平方函数｡
我们的square函数不会返回任何数据, 它将是空的｡
我们现在必须传递一个地址, 因为第4行的square函数要取一个指针｡
所以我们不能传递一个数字, 我们必须实际传递数字的地址,
然后我们用分号结束它｡ 因此,
我们使用函数名调用函数, 然后传递变量的地址｡
因为第八行的变量不是指针｡
然后我们就可以打印出num的值了｡
同样, 你们会注意到,
因为我们传递的是地址, 如果我们改变了函数本身的数据, 变量的外部也会改变.
这里我们假设给定数字的平方是, 比如说, % d,
我们加一个换行符,
然后输出num, num不会是9.
, 我就告诉你这么多｡
然后我们将为常规函数返回0｡
所以现在我们必须实际实现函数, 定义它｡
为了定义它, 我只说是无效的正方形｡
我们知道它需要一个整型指针, 所以我会说int星星x｡
现在我们只想把它乘以它自己｡
但我们要确保地址不变｡
我们可以把它设为常量, 但是你应该把常量放在数据类型后面因为我们不想改变x的值或者它指向的地址,
所以我们可以说是int常量｡
如果我们不想改变x的值, 我们会说是常数｡
但我们确实想改变x的值, 我们要把它平方｡
所以要把它平方, 首先,
我们要改变的是x的最终值｡ 所以我们必须使用间接操作符｡
我们必须用星号取消引用｡
然后我们只需要说等于,
我们不想做x乘以x, 因为那只是地址的乘积｡ X是一个指针,
我们不想只得到x的值, 我们想得到x所指向的对象的值｡
所以, 我们必须解引用它,
然后我们要把它乘以它自己｡ 我们要取消引用它两次｡
把它放在括号里可能是个好主意, 这样就很容易理解这里发生了什么｡
你要解引用指针, 得到它的值,
然后乘以它的值, 再加上分号,
就这样了. 所以当我们运行这个程序的时候, 它会打印出81｡
它会输出num的值｡ 因为我们在这里传递地址, 所以数字会在方块内改变｡
我们不能改变指针的值, 所以我们在类型后面有常量.
所以这里我们说构建, 看起来我们没有改变声明.
而现在我们只想确保其他一切都是正确的｡
如果你想让指针保持不变, 你必须把它放在星号后面｡
所以int start常量意味着你不能改变x的值,
也就是num的地址｡
如果我们把const放在int之前或input之后星号之前, 这意味着你不能改变指针所指向的值｡
所以现在我们运行这个程序时, 应该会看到输出81｡
同样,
这告诉我们, 我们修改了数据｡
这个变量, 这个局部变量num在函数内部被修改了, 它的值也改变了｡
这不正常｡ 我们到现在还没有学到这个概念｡ 它是通过引用传递的｡
但在c中, 你传递的是地址的副本｡
这就是为什么它是多余的,
我们甚至不需要常量因为即使我们要改变指针的值, 它也是指针值的副本, 所以你不需要这么做｡
现在如果我们不想使用一个已有的数字, 我们可以创建一个指针,
我们只需要为它分配内存｡
所以我们要做的就是创建一个int, 星星, num.
但是我们要做的是首先我们要转换malloc因为malloc返回一个void指针但是我们可以动态地分配内存.
在这里, 我们必须说因为我们创建了一个整数, 我们可以只说int的大小,
这样就可以为我们分配内存｡
然后, 我们要做的就是进入num的平方.
当我们构建这个的时候, 它也会做同样的事情,
但是现在也没有num的值, 所以实际上不知道要计算什么, 所以你必须给num赋值, 这里是4,
你取消引用它｡
现在当你构建并运行它时, 你应该得到16｡
现在我们要打印出这个值, 所以我们要说num｡
然后我们运行它, 我们应该看到16｡
这其实是同一种行为, 我们确实看到了16｡
这里唯一的区别是, 我们分配的内存是点所指向的, 而不是仅仅指向一个现有的内存位置与符号｡
同样, 这里需要注意的是, 这个数字在函数之外是变化的｡
这是通过引用传递的理解｡
这里我们使用了解引用操作符, 间接操作符来获取点指向的值｡
如果函数接受一个指针, 我们也有一个指针,
我们只需要把名字发送进去就可以了｡
如果它没有接受指针, 而是一个值, 那么我们就必须解引用它.
这就像scanf一样｡
所以这里我们要用[&]号.
当我们把它打印出来的时候,
我们不需要去引用任何东西, 因为它不是一个指针, 这里是一样的｡
然后理解const二｡
int星星前面的Const表示该点指向的值不能更改｡
int开始后的const是说指针的地址不能变, 改变指针的值｡
我希望这对你有帮助｡
再一次, 玩这个, 改变一些语法, 像我一样乱来乱去｡
它会帮助你学到很多东西｡ -谢谢—谢谢