通用型指针,函数指针,数组指针

本文详细介绍了C语言中的通用指针(void *),包括其强制类型转换、作用及易错点。讨论了指针运算,如指针的加减法,并解释了为什么两个地址不能直接相加。接着探讨了数组运算,指出数组名等价于首元素的地址,以及数组下标的本质。此外,还讲解了二级指针、数组指针和函数指针的概念与用法,通过实例展示了如何定义和使用这些复杂指针类型。
摘要由CSDN通过智能技术生成

一、通用类型指针?
1、强制转换类型。
int a = 100;
int *pa = &a;

char b = 'x';
char *pb = &b;

在这里,我们能不能将&b赋值给pa,把&a赋值给pb?
int *pa = &b;
char *pb = &a; -> 编译警告: warning: initialization from incompatible pointer type
                //两边的类型不一致

int *pa = (int *)&b;
char *pb = (char *)&a;   -> 编译通过。

强制转换类型:int *pa = (int *)&b;  &b默认是char*类型的指针,(int*)就是将这个&b地址强制转换为int*类型的指针。
                   (&b这个地址是指向第一层楼的,但是现在是指向前4层楼)
本来&b指向一个char类型的数据,但是现在指向int类型的数据。

2、什么是通用类型的指针?
通用类型指针变量其实就是可以存放任何类型的指针变量,也就是说什么类型的指针都可以赋值给通用类型的指针。

int*pa  -> 只能赋值一些int*类型的指针,否则就会报错。
char*pb -> 只能赋值一些char*类型的指针,否则就会报错。

通用类型指针类型: void*
通用类型指针变量: void*px  -> 任何类型的指针(无论是char*,int*,float*,double*),都可以存放在void *px这个变量。
                  (只是用来装地址的变量,至于这个地址指向什么数据,它就不知道了)

3、通用类型指针有什么作用?  -> 解析强制转换类型的意义。
1)任意特定类型指针都可以赋值给通用类型指针。

int a;   ->变量a的地址是int*类型
char b;  ->变量b的地址是char*类型
double c;->变量c的地址是double*类型

void *p = &a;
void *p = &b;
void *p = &c;

以上几句话含义是什么意思?
仅仅是把a变量的地址,b变量的地址,c变量的地址的那个地址值赋值了p,一旦赋值了给p之后,这个地址指向的内容就变成了未知。

2)通用类型指针变量赋值给一写特定类型的指针变量?

int a = 100; //在内存中连续申请4个字节,然后使用变量a间接访问这片内存空间。
void *p = &a; //将a对应的这片空间的地址赋值給通用类型的指针p,这时候p确实可以保存a的地址,但是p指向的内容是未知的。
char *pa = p; //将a对应的这片空间的地址赋值給指针变量pa,这时候pa确保是保存着a的地址,而且非常明确地知道pa是指向一个字符类型的数据。

3)综上所述:
int a;
int *pa = &a;  //pa是存放着a的地址,pa指向int类型的数据。
void *p = pa;  //p是存放着a的地址,p指向未知的区域。
char *pb = p;  //pb是存放着a的地址,pb指向char类型的数据。

等价于

int a;
char *pb = (char *)&a;   ->强制类型转换就是使用void *去解析的。

4)易错点。
void a;    -> 没有void型变量,只有void*变量。
void *p = &a;

int a = 100;
void *p = &a;
int b = *p;  -> 编译出错:不能解引用void*指针。

  结论: 如果你一定要解引用通用类型的指针,想得到这个指针指向的东西,那么就一定要先将通用类型指针强制转换为某种特定的指针。

正确:
int a = 100;
void *p = &a;
int b = *(int*)p;

二、指针运算。
1、指针的加减法。
int a = 100;
int *pa = &a;  //pa就是存放着a的地址

pa+1  -> 将a的地址往上偏移1个单位</

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值