(持续更新中!!~)11、原来可以这样理解C语言_深入理解指针(3/8)指针变量类型的意义

深入理解C语言指针变量类型的意义

目录

3. 指针变量类型的意义

3.1 指针的解引⽤

3.2 指针+-整数

3.3 void* 指针


 

3. 指针变量类型的意义

        指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各 种各样的指针类型呢?

        其实指针类型是有特殊意义的,我们接下来继续学习。

3.1 指针的解引⽤

        对⽐,下⾯2段代码,主要在调试时观察内存的变化。

//代码1 

#include <stdio.h>

int main()
{
     int n = 0x11223344;
     int *pi = &n; 
     *pi = 0; 
     return 0;
}
//代码2 

#include <stdio.h>

int main()
{
     int n = 0x11223344;
     char *pc = (char *)&n;
     *pc = 0;
     return 0;
}

        调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0。

         结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。

         ⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。

3.2 指针+-整数

先看⼀段代码,调试观察地址的变化。

#include <stdio.h>

int main()
{
     int n = 10;
     char *pc = (char*)&n;
     int *pi = &n;
 
     printf("%p\n", &n);
     printf("%p\n", pc);
     printf("%p\n", pc+1);
     printf("%p\n", pi);
     printf("%p\n", pi+1);
     return 0;
}

代码运⾏的结果如下:

4c8f514965954204afa8923462986e86.png

        我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。 这就是指针变量的类型差异带来的变化。指针+1,其实跳过1个指针指向的元素。指针可以+1,那也可 以-1。

         结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)

3.3 void* 指针

        在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为⽆具体类型的指针(或者叫泛型指 针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进 ⾏指针的+-整数和解引⽤的运算。   

举例:

#include <stdio.h>
int main()
{
     int a = 10;
     int* pa = &a;
     char* pc = &a;
     return 0;
}

        在上⾯的代码中,将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。编译器给出了⼀个警 告(如下图),是因为类型不兼容。⽽使⽤void*类型就不会有这样的问题。

3e4874b6b59343aca015ec4b2edbd69a.png

        使⽤void*类型的指针接收地址:

#include <stdio.h>

int main()
{
     int a = 10;
     void* pa = &a;
     void* pc = &a;
     
     *pa = 10;
     *pc = 0;
     return 0;
}

        VS编译代码的结果:

a98bd6fe69ca40328c50997673befcb5.png

        这⾥我们可以看到, void* 类型的指针可以接收不同类型的地址,但是⽆法直接进⾏指针运算。

        那么 void* 类型的指针到底有什么⽤呢?

         ⼀般 void* 类型的指针是使⽤在函数参数的部分,⽤来接收不同类型数据的地址,这样的设计可以 实现泛型编程的效果。使得⼀个函数来处理多种类型的数据

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值