指针的定义和使用

1.指针是变量,但是指针的字节长度是固定的。因为指针保存的是地址,由操作系统的位数决定,32位机的字节是4,64位机的字节是8。

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给它分配空间,这样可以避免野指针的出现!


  • 18
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值