【C 语言】指针 Four 之 [" * & 的应用"、通过指针交换变量值、指针变量的说明、 指针类型的意义 (1)、指针类型的意义 (2)]
🗡 " * & 的应用"
如下所示👇
运行结果
三个 printf() 打印的值都是一样的(同样可以思考下这个是为什么)
🗡 通过指针交换变量值
既然都看到这里了,那么我们就来尝试做一道题目吧,看看你是否掌握这些知识点了。
题目内容:用指针交换两个值。
运行结果🖊
交换前的值:a = 10, b = 20
交换后的值:a = 20, b = 10
对程序进行说明如下↓
swap() 是用户定义的函数,它的作用是交换两个变量 (a 和 b) 的值。swap 函数的形参 pa、pb 是指针变量。程序运行时,先执行 main 函数,已知 a 和 b 的值。然后将 a 和 b 的地址分别赋给指针变量 pa 和 pb,使 pa 指向 a,pb 指向 b
用图形表示如下如下↓
🗡 指针变量的说明
指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算符以及关系运算。
指针运算符如下↓
取地址运算符 &: 取地址运算符 & 是单目运算符,其结合性为自右至左,其功能是取变量 的地址。
取内容运算符 : 取内容运算符 ***** 是单目运算符*,其结合性为自右至左,用来表示指针变 量所指的变量。在*运算符之后跟的变量必须是指针变量。
需要注意的是指针运算符* 和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中, “*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*” 则是一个运算符用以表示指针变量所指的变量。
🗡 指针类型的意义(1)
指针类型的意义,代码如下所示↓
此时,经过调试阶段我们可以发现,首先 a 的地址赋值给指针变量并且对象类型是 int 类型。然后,再通过 解引用 *pa 把原来 &a 的地址变成 0,那么通过这个现象,我们就可以知道用 int * 进行解引用的话,我们是成功访问到 ④个字节 的地址。是不是可以说明指针访问字节是④个字节呢。
经过调试阶段我们可以发现,首先 a 的地址赋值给 指针变量并且对象类型是 char 类型。然后,再通过 解引用 *pa 把原来 &a 的地址变成 0。那么通过这个现象,我们就可以知道用 char * 进行解引用的话,而我们是成功访问到 ①个字节 的地址。可以看出只是类型发生了变化,访问权限就会发生变化。从这里说明了指针是只能访问④个字节的,这是 C 语言语法标准规定死的。
所以从上面两个不同指针对象,我们就可以从中发现。只是不同类型的变化,就可以在调试当中发现它们的访问权限就发生了变化。这就从中说明指针类型是具有意义的。
如果我是①个整形指针(int*)的话,解引用的时候,我去访问一次的话。解引用一次就可以访问④个字节。按照上面图中我就可以把④个字节全部变成 0 了。
然而,如果我是一个字符指针(char*)的话。我解引用一次我就只能访问其中的①个字节。
通过这个例子可以知道:不同类型指针在解引用的时候就决定它的访问权限有多大。
🗡 指针类型的意义(2)
接下来,举出第②个例子。如下代码所示↓
编译器运行结果如下↓
在第二行编译运行结果上,如果是我整形指针+1 的话。我实际上的值+4
在第四行编译运行结果上,如果是我字符指针+1 的话。我实际上的值+1
字符指针+1 的话,相当于跳过了一个字符。那么跳过一个字符的话,我不就相当于+1。
如果我是整形指针+1,相当于跳过一个整形。如果跳过一个整形,就相当于跳过 4 个字节。那其实就是相当于+4。
那这个为什么会产生这样的不同呢?因为 p 以及 pc 的指针类型不同。
那么从这个角度可以知道:指针类型决定了指针走一步就可以走多远,也就是步长。
版权声明: 本文为 InfoQ 作者【泽En】的原创文章。
原文链接:【http://xie.infoq.cn/article/709962cd6575994e143f9d6ed】。文章转载请联系作者。
评论