37.【C语言】指针(重难点)(B)

目录:

5.疑问解答:指针的解引用

6.指针+或-整数

7.特殊类型*void指针

承接上篇19.【C语言】指针(重难点)(A)

5.疑问解答:指针的解引用

观察下列代码产生的现象

#include <stdio.h>
int main()
{
  int n = 0x12345678;//十六进制存储
  int* pi = &n;
  *pi = 0;
  return 0;
}


改为char

#include <stdio.h>
int main()
{
  int n = 0x12345678;//十六进制存储
  char* pi = &n;
  *pi = 0;
  return 0;
}


改为short

#include <stdio.h>
int main()
{
  int n = 0x12345678;//十六进制存储
  short* pi = &n;
  *pi = 0;
  return 0;
}

 

发现:char* 的指针解引用就只能访问1个字节,而short*的指针的解引用能访问2个字节,而 int* 的指针的解引用就能访问4个字节(x64、x86下的结果一样)

总结:指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)

 6.指针+或-整数

#include <stdio.h>
int main()
{
  int n = 0x12345678;//十六进制存储
  int* pi = &n;
  short* ps = &n;
  char* pc = &n; 
  printf("&n=%p\n",&n);
  printf("pi+1=%p\n",pi+1);
  printf("ps+1=%p\n",ps+1);
  printf("pc+1=%p\n",pc+1);
  return 0;
}

发现:char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节,short* 类型的指针变量+1跳过2个字节(同理+2,-1,-2……+n,-n)

总结:指针的类型决定了指针向前或者向后走一步有多大(距离)

7.特殊类型void* 指针

*定义:无具体类型的指针(或者叫泛型指针)

*注意:这种类型的指针可以用来接受任意类型地址,但是也有局限性:不能直接进行指针的+-整数和解引用的运算(*pv=? 错误 pv+1 错误),除非强制类型转换( *(int*)pv=200 )

#include <stdio.h>
int main()
{
  int n = 0x12345678;//十六进制存储
  short* ps = &n;
  return 0;
}

运行后会报警告:

但如果用:

#include <stdio.h>
int main()
{
  int n = 0x12345678;//十六进制存储
  void* pv = &n;
  return 0;
}

则没有问题

注:一般void* 类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值