2.指针指向的内存空间和对应的内存空间
我在这里定义了一个整型指针p保存num的地址(0x1000),num的地址就是首字节的地址,而指针p本身的地址为0x2000。下面我们来引入指针的定义:
num对应的内存空间为5,指针p对应的内存空间为0x1000,指针指向的内存空间为5。
num++:对num对应的内存空间加1。 5 --> 6
p++:对p对应的内存空间加1。(步长) 0x1000 --> 0x1004
(*p)++:对p指向的内存空间加1。其中*p是根据p对应的内存空间找到其对应的内存空间。 5 --> 6
等式:
p == &num
*p == num == *(&num)
下面我们再举一个例子来进一步说明,如下图所示
在这里定义了一个二级指针pp保存指针p的地址(0x2000),而指针pp本身的地址为0x3000。
pp对应的内存空间为0x3000,pp指向的内存空间为0x2000。
等式:
num == *p == **pp == *(&num)
p == &pp
3.指针的运算
a.指针 +/- 整数 = 指针所对应的内存空间与它所指向的类型乘以整数相加减。eg. p++ --> p = p + 1
b.指针 - 指针 = 两个指针相差的数据个数。
c.指针的比较:如果两个指针变量指向同一个数组的元素,那么指向前面元素的指针变量小于指向后面元素的指针变量。
d.指针加指针没有实际意义。
4.万能指针(void *)
void * 可以表示任意一种类型的指针。我们知道相同指针类型之间才能进行赋值,下面我将举出一个例子来进行说明
#include <stdio.h>
int main()
{
char *ptr = "hello world";
int *tmp = ptr;
printf("%s\n", tmp);
return 0;
}
main.c: 在函数 ‘main’ 中:
main.c:15: 警告:从不兼容的指针类型初始化
我们可以看到不同指针类型之间会出现不兼容。使用void * 的时候不会出现警告,但是void * 只能接收,不能取值,一旦取值就会出现段错误。
5.指针的使用
当我们给指针赋值的时候,我们要注意指针是否分配了合理的内存。如果指针的地址为空,那么就要在堆上用malloc给它分配空间,这样可以避免野指针的出现!