C语言程序乘法算不对,C语言中的指针该怎么理解?书上太难懂了,你能画图举例说下基本的指针操作吗?...

谢谢邀请。

“指针是C语言的灵魂,指针可以直接操作内存,指针使C语言程序更加高效”,等等等等。相信C语言初学者学到指针时,会看到很多这样描述指针的话,但是却往往一头雾水。

84584b77fe86155b978972adf34bff79.png

其实C语言的指针并没有什么难的,将其看做是一种类似于 char、int 的基本数据类型就简单了。

我在上个问答中提到C语言中的不同的基础数据类型主要区别之一就是占用的存储空间不同,程序是运行在计算机的内存中的,因此C语言程序的变量也是存在于内存中的。

95af4e321d0e4c4e0e8aec42389c5769.png

C语言标准规定 char 类型占用一个字节的存储空间,对其他整型却没有做规定,现在为了解释的方便,我们假设 int 类型的数据占用内存 4 个字节。

假设我们如下定义了两个变量:

30d339ea16042e8629bbd252443842c7.png

那么,i 占用了 1 字节的内存空间,j 占用了 4 字节的内存空间,请看下图。

5a0896ee23bf5f716db0ea8c9e418c2a.png

方框表示内存空间,内部表示存储的值。我们把内存逐字节编号,方框外部的数字表示方框的编号(这样的内存“编号”即所谓的“内存地址”)。

修改变量 i 的值,实际上就是修改地址为 4000 的内存空间里的值。那反过来呢?如果我修改了地址为 4000 的内存空间里的值,i 的值会相应改变吗?答案是肯定的,请继续往下看。

9cd012cca2e384907c9443977ca7c8e8.png

上图中的内存地址“4000”是我为了解释方便随意取的。那么,在实际应用中,变量 i 的地址如何获取呢?C语言提供了“&”运算符,就是获取变量地址的。请看下面的例子:

456aed19911fc9a486b0880ba8b65856.png

我们取出了 i 的地址,把它强制转换为 long 型,传递给 p1 了。编译并执行这段C语言代码,得到如下输出:

c7d53ccba657d6e04d6d441e10104b45.png

发现变量 i 的地址被打印出来了,这说明,C语言程序变量的地址也是一个整数。

按照上面的说法,修改 i 的值除了直接对 i 赋值以外,还可以通过修改 p1 地址处的内存空间里的数值。那,怎样才能“通过修改 p1 地址处的内存空间里的数值”修改 i 的值呢?

上面的代码实例中使用了 long 型变量 p1 存储了 i 的地址。事实上,C语言有专门的数据类型存储地址(即所谓的指针),定义方式也很简单,就是:“类型描述符 * ”,例如,可以定义以下变量存储地址:

6ac66d978b6229f8ce9f83130cbf4f51.png

p1 和 p2 就是C语言中所谓的指针类型,因为 i 是 signed char 类型的,所以定义了 signed char * 类型的指针存储 i 的地址。j 是 int 类型的,所以定义了 int * 类型的指针存储 j 的地址。

另外,C 语言提供了“&”运算符取变量地址,与之对应的,还提供了“ * ”运算符从相应地址内存里取出数值。

了解了C语言的指针类型和“ * ”运算符,现在来看看如何“通过修改 p1 地址处的内存空间里的数值”修改 i 的值。请看如下C语言代码:

ca21afcedbc6331578044ca91ed53c3a.png

编译并执行,得到如下输出:

20952bf7ec1695e82e7ee682a36d7bc2.png

编译运行,发现程序输出“i=5”,这一值实际上就是通过指针修改的。可以看出,C语言中的指针并没有什么难的。在定义变量时,” * “放在变量符号前,可以定义指针变量。在定义完指针变量后,“ * ”放在变量前,就表示从地址取值的运算符了。另外,“ * ”还可以表示乘法运算符,读者自己思考什么情况下,“ * ”表示乘法运算符。

可以看出C语言中的指针一点也不神秘。题主可以点我主页,查看我之前的文章,了解更多指针问题:比如为什么 int 类型的变量 j 的地址要使用 int* p2; 定义,而不能使用 signed char* p2; 定义,使用指针为何能写出紧凑、高效的 C语言程序等等。

888be80475104b2a61dbf2152f1313c5.png

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值