你好, 欢迎回来｡
在这节课中, 我想讲的是访问指针指向的值, 记住指针,
它们存储内存地址｡
该内存地址实际上包含某处的值｡
所以指针指向那个内存地址｡ 我想得到它指向的值｡
因为我只会打印出一个指针的值, 它是一个地址, 但我想得到地址,
我想得到地址的值｡
因此, 您可以使用间接寻址运算符访问指针指向的地址的值｡
间接运算子是星号｡
我们学习了如何使用星号来声明指针, 我们还将使用星号来查找指针所指向的值｡
所以它也被称为解引用运算符因为你用它来解引用一个指针.
比如说, 如果你有一个数字,
它等于15, 你声明一个int类型的指针, 指向一个int, 然后用""号给它赋值.
现在你如何得到指针指向的值｡
您可以取消引用｡
基本上你可以知道指针指向的值是15, 因为它指向的是数字15的地址｡
所以指针变量包含了变量的地址号｡
您可以在表达式中使用此值来计算结果的新值｡
比如说我们想让result等于指针指向的值加5.
您可以在指标名称之前使用星号｡
所以它的作用是, 它会告诉我们指针变量指向什么,
它指向15, 再加上5.
它是指针指向的地址, 这个地址的值是多少.
所以你应该注意到, 间接操作符星号也是用于乘法的符号, 当你声明指针类型时也会用到它.
所以这会让人很困惑｡
你怎么知道编译器是怎么工作的｡
好吧, 这都是背景的问题｡ 这取决于您何时使用星号以及在何处使用星号｡
如果你在声明指针的时候在指针的类型后面加上星号, 那么很明显就是在使用声明｡
如果你在两个数字之间使用星号, 那么它被用于乘法｡
如果它被用在指针名的前面, 比如说, 或者指针名的右边,
或者左手, 那么它就是在赋值或者访问一个值.
所以当你使用这些间接操作符时, 这一切都与上下文有关｡
这就是它的工作原理｡
这就是编译器的解释方式｡
在这个例子中,
当你看到它的时候, 星星指针,
而你之前没有数据类型或者两边没有两个数字, 那么你就知道它是一个间接指针, 取值指针.
让我们看一个例子｡
这是另一个例子,
我们要创建一个等于10的整数计数｡ 我们还将创建一个名为x的整型变量｡
我们将count初始化为10, x初始化为0｡
然后我们创建一个int指针｡
我们知道它是一个整型指针, 因为在数据类型后面有星号,
然后我们把它命名为整型指针.
我们现在要给int指针赋值count的地址.
因为请记住, 指针只包含地址作为它们的值,
但它们也指向某个东西｡
所以我们可以给变量x赋值, 不管int指针指向什么,
指针中包含的地址值是多少｡
所以x实际上会显示为10｡
10. 如果我们继续显示count, percent,
ird, x, percent, ird, count等于10, x等于10｡
这就是你如何去引用一个指针并得到它的值｡
如果你想显示指针的值, 它就指向因为指针在内存中有一个值,
它只是一个地址.
那么, 如果你想显示指针的值,
它由一个十六进制数整数和地址表示呢？
你可以使用格式说明符percent p｡ 我们之前谈过这个｡
这将以十六进制形式输出一个指针值作为内存地址｡
所以如果我们要做这样的事情,
我们声明我们的数, 我们声明我们的指针, 我们把它初始化为空,
因为这是一个很好的实践, 我们希望总是这样做, 当你没有在声明中给指针赋值的时候, 确保你把它初始化为空｡
然后, 我们将变量10赋值给数字｡
然后我们把指针指向number的地址｡
所以p的值实际上是一个地址｡
地址｡ 所以如果我们要打印出来, 我们会用百分比p, 这就是地址的值｡
如果我们想打印出它所指向的内容, 就必须使用间接操作符取消对它的引用｡
但是当你打印出地址时,
它是以十六进制的形式打印出来的指针在内存中占据了8个字节, 地址有16个十六进制数字.
那这是怎么做到的呢？
这取决于您的机器是否支持64位或32位地址｡
如果你的机器有64位操作系统, 那么你会看到16个十六进制数字｡
如果您的机器或操作系统只有32位寻址, 那么您将看到十六进制表示为8个十六进制数字｡
现在, 如果您要显示地址, 该怎么办？
你可能会说有什么区别, 因为指针有一个值｡
但您也可以显示带有操作员地址的地址｡
所以在这个例子中, 我们要显示的地址为number｡
数字不是指针｡ 数字只是一个整数｡
如果我们想得到它的地址, 我们就用&号｡
如果我们想显示它的地址, 你只要再用一次percent p｡
您只需应用“&”号｡
因此, 如果我们在指针变量中提供了“与”符号, 我们实际上会显示指针的地址,
而不是指针的值｡
请记住, 指针的地址是内存中的某个地址｡
指针值是它所指向的地址｡
它指向的值在内存中的其他地方｡
请记住我们展示指针如何工作的那个示例｡
当您宣告指标时, 会为该指标建立8个字节的内存｡
该指针的值是一个地址｡
指针指向的是一个值, 通常是你提供的类型.
但请记住, 它实际上有三个部分｡
如果你想打印出p数字地址, 你需要再次使用“&”号｡
这将是实际指针的地址｡
你必须使用虚空星星来避开警告｡
所以请记住, 指针本身有一个地址, 就像任何其他变量一样, 当你声明它时,
它就被分配了｡
您可以使用百分比p作为转换说明符来显示地址｡
您可以使用“与”运算符的地址来引用p编号变量所占用的地址｡
这是指针的地址｡ 然后, 指针又具有地址值｡
强制转换为void是为了防止编译器发出警告,
特别是percent p规范要求值为某种指针类型｡
但“与”号的类型是一个指针指向它的一个指针｡
所以你必须投出它｡
显示指针正在使用的字节数｡
另一种获取指针信息的方法｡
这里可以使用sizeof运算符｡
我们已经学习了sizeof运算符来显示不同的数据类型bytes｡ 你可以用指针做同样的事情｡
在我运行的机器上, 这将占用8个字节｡
机器地址有64位, 因为它是64位操作系统｡
而且当你这样使用sizeof时你可能会得到一个编译器警告, sizet是一个实现定义的整数类型｡
若要避免出现警告, 您可以将参数转换为int类型, 如下所示｡
所以你要做的就是说p个数字大小, 百分之d个字节｡
你会说int, 把它转换成一英寸大小的p数｡
它会给予你内存中指针的大小, 这个地址的指针大小,
在大多数系统中是8个字节.
因为那只是一个地址｡
再举一个例子｡ 这将显示许多内容｡
我们将运行此示例以显示输出｡
但在运行之前, 我想先描述一下这里发生的事情｡ 我们有一个公开的数字｡
我们有一个初始化为null的指针｡
我们将number的值设置为10｡
然后我们要打印出整数的地址, 然后打印出数字的值, 非常简单, 用运算符的地址,
然后就是变量.
当我们计算运算符的地址时, 我们计算百分比p｡
然后我们把number的地址赋给指针｡
然后我们将打印出一些指针信息｡
我们要输出指针本身的地址｡
我们可以使用百分比p, 空星星和数字｡
我们想知道这个指针在内存中有多少字节｡ 我们可以说sizeof｡
我们希望看到指针的实际值, 也就是地址｡
我们可以直接说p, 没有任何额外的信息, 然后我们用p的百分比｡
如果我们想知道指针指向的值, 地址的值, 那么我们就用星星p来表示,
我们用间接操作符｡
我们知道p的值指向in所以我们可以说是% d｡
让我们以代码块的形式看一下这个示例, 看看它实际上是如何显示的｡
我们将看到的是一些十六进制数字,
表示地址, 无论何时显示地址, 我们将看到其他情况下的值｡
这看起来应该很熟悉｡
这只是一个程序, 它向你展示了如何访问指针的不同部分｡
同样, 我们有一个正则数数据类型int, 还有指针｡
我们将其初始化为null｡
我们首先要显示我们的数字, 也就是10｡
它会显示number的地址, 然后在第10和11行显示number的值｡
然后我们给指针赋值, 即number的地址.
如果我们想知道指针的实际地址, 我们只需要使用&, 运算符的地址,
然后把它转换成void星星.
我们使用p百分比｡
如果我们想知道指针在内存中有多少字节, 我们可以使用percent d sizeof｡
如果我们想看到地址, 指针的值, 我们用百分p,
我们只写p数, 因为p数是一个地址｡
如果我们想知道指针指向了什么, 地址的值在指针的值里,
我们就写上星号p号, 我们解引用它,
间接操作符｡
那我们开始吧｡
当我运行这个程序时, 你会看到打印出来的前两个东西,
第六行的数字地址,
是一个十六进制数字, 0060ff0c｡
这实际上是在运行一个32位程序, 所以你可以看到它只有8位｡
数字变量为10｡
然后我们打印出指向已分配内存的实际指针的地址｡
地址和号码不一样｡
因为这是分配给指针的地址｡
指针编号的大小为4字节, 这意味着它是一个32位寻址｡
指针的值,
也就是number的地址, 应该是一样的, 都是0060ff0c｡
你可以看到,
你可以通过名字, 得到数字的地址, 带百分比p的指针｡
我们看到运算符的大小为4字节｡
如果你想得到p数值指向的值,
也就是10, 你必须用间接操作符去引用它, 你会看到它被打印成10.
但是你可以看到,
当你显示地址时, 用的是百分比p, 当你显示整数指针的值或者字节数时, 用的是百分比e｡
这是访问指针值的基本语法｡
指针的地址, 与号, 指针指向的值,
只是变量的名称, 指针本身的值只是变量的名称,
然后指针指向的值使用间接运算符｡
-谢谢—谢谢 希望这对你有帮助｡ 研究这个, 把这个看一遍｡