C语言的指针是C语言中的重点,其实所有的编程语言中指针都是至关重要的部分。在另一篇文章中我对C语言指针的概念以及简单的运用做了简单的说明。在本文中将会继续对指针的知识深入,下面会对指针的递增、递减以及算术符进行说明。
指针的算术运算
指针是一个用数值表示的地址。指针的有限算术运算:自增(++), 自减(--), 加上一个整数(+, +=), 减去一个整数(-, -=), 以及减去另一个指针。
举个例子帮助理解:
图中可以看出,p++之后对应的地址向高地址增加了4个字节。我们来分析程序:指针p的类型是int,所指向的类型为int。然后它被指向整形变量a(强制类型转换不会改变a的类型),然后p++,在编译器中它把指针ptr 的值加上了sizeof(int)也就是加上了4,因为在32 位程序中,int 占4 个字节。由于地址是用字节做单位,所以p所指的地址增加了4个字节(如图)。
要注意的是:此时的a并没有发生变化,变化的是p。p原本指向a[0],但是在p++之后,p指向a[3](char类型的长度是一个字节)。
指针的递增
指针和数组有一个区别:变量指针可以递增,但是数组却不行,因为数组是一个常量指针。上面的例子中也是指针的递增,不过用的是char类型的数组,下面举例的代码中是int类型的数组,我们看看两者之间的不同。
图中的结果在p++之后,却只是在数组中的增加了一个位置,这是因为int类型长度是一个字节。
指针的递减
和递增一样的方法,这里就不做解释了。
指针比较
指针也是可以用作比较的,可以运用算术运算符进行比较,例如==、<、>。在一个程序中如果有两个指针分别指向两个不同的变量,就可以进行大小比较。
例如:
图中的数组是int类型的,b1、b2指针也是指向int类型的。一个指向a[0],一个指向a[4]。在对指针所指向的变量进行大小比较的时候要注意,要加上* 才代表所指向变量的值。
下面举一个误区:
看完这个程序你认为输出会是什么?
“**ptr=h **ptr=e”?这你就错了
ptr是char **类型,指向了一个char *类型,也就是说ptr指向了&p,那么在ptr++的时候就加上了一个sizeof(char *),也就是加4,。所以是&p+4,但是&p+4并不在a数组中,可能指向内存中随机位置。谁知道呢?在这里我就不把结果的代码发出来,因为根本发不出来,程序直接出错。
运算符&和*
这里&是取地址运算符,*是间接运算符。
要注意的是,在代码中你会发现在获取int或者char类型的时候,有时候需要有时候不需要。就&a来说,如果a是数组的时候可以直接指向a,但是你要指向a[2]就要用&a[2]。如果a是字符也需要&a。
*p 。直接使用*p 的结果是p 所指向的东西。
本文对指针的算术运算进行了简单的介绍,指针是C的重点也是难点,其实说难也不难。只要你认真的记住一些指针中容易混淆的地方,指针对你来说就不难了。如果你编写指针的程序总是出错,你要注意&和*的运用是否正确,很多初学者都是在这个地方不注意导致的。
¥399.00
¥29.00
¥498.00
¥299.00