指针类型,你真的明白嘛?

简介: 指针类型,你真的明白嘛?

在说指针类型前,我们先热身一下,int类型占4个字节、short类型占2个字节、char类型占1个字节。一个字节又分8个bit。更详细一点:

int a=5;  //  四个字节、一个字节8个比特位
            00000000 00000000 00000000 00000101
short a=5; // 两个字节、一个字节8个比特位
                              000000000 00000101



指针类型是什么?


    指针变量的类型分为整形指针、字符指针、数组指针等等。 例如:整形指针 int* p 、字符指针char* p、短整形指针short* p等。但它们都有一个共同点:在32位系统下占4个字节,在64位系统下占8个字节。    


重点来了,字节已经确定,为什么还需要划分类型来区别呢?又或者说划分类型有什么作用呢?


1、决定了指针类型进行解引用操作的时候,一次性访问n个字节


char* 一次可访问1个字节(8个bit位)              int*  一次可访问4个字节(32个bit位)  等等

    int a=0x11223344;  //想想两位16进制的大小和8位二进制的大小
                           11       22      33        44
            对应的二进制是  00010001 00100010 00110011 01000100
char* p=&a;
printf("%d",*p);  // 打印得:68
  //指针p只能访问一个字节 所以只能有后面的8位bit,也就是:01000100
int* p=&a;
printf("%d",*p);  //打印得:287454020
   //指针p只能访问4个字节:00010001 00100010 00110011 01000100(全部)

2、如果我用指针指向不同类型的变量,然后通过指针修改变量值呢?

int a=0x11223344;
  //      对应的二进制是:00010001 00100010 00110011 01000100
                十进制是:287,454,020(逗号不存在)
char* p=&a;
*p=20;    //20对应的二进制是00010100;
printf("%d",*p);  // 解引用一个字节,所以打印得:20
printf("%d",a);   // 打印287,453,988,因为指针p把a后面的一个字节修改了


结论:效果很明显,只能在原来的变量上修改自己解引用部分,

3、那么指针类型不同和地址的关系呢?

int a=0x11223344;  //想想两位16进制的大小和8位二进制的大小
               11         22         33           44
             00000000    00000000    00000000     00000000
int* p=&a;
char* w1=&a;
printf("%p",p);     //
printf("%p",p+1);   // p和p+1的地址相差4,因为指针类型为int,所以跳过4个字节
printf("%p",w);
printf("%p",w+1);   // w和w+1的地址相差1,因为指针类型为char,所以跳过1个字节


结论:很明显,(指针)和(指针+1 )的地址相差取决于指针类型

注:有些编译器不支持 指针指向不同的类型变量,所以我们可以强制类型转换

例如:   char* p = (char*) & a;

目录
相关文章
|
7月前
|
存储 C语言
文件的类型指针
文件的类型指针
82 0
|
7月前
|
编译器 C语言
void的指针类型
void的指针类型
47 0
|
7月前
|
存储 程序员 C++
在C++编程语言中指针的作用类型
在C++编程语言中指针的作用类型
85 0
|
2月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
4月前
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
51 0
|
6月前
|
编译器 C++
函数指针和函数对象不是同一类型怎么替换
函数指针和函数对象不是同一类型,为何可替换用作同一函数的参数
|
7月前
|
存储 安全 C语言
void指针类型详解
void指针类型详解
82 2
|
6月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
52 0
|
6月前
|
图形学 Windows
程序技术好文:记录类型指针
程序技术好文:记录类型指针
28 0