【C语言】-指针(1)

张开发
2026/4/8 7:09:11 15 分钟阅读

分享文章

【C语言】-指针(1)
个人主页深邃-❄️专栏传送门《C语言》《数据结构》Gitee仓库《C语言》《数据结构》目录内存和地址指针变量和地址指针变量和解引用操作符*指针变量的大小内存存放指针变量类型的意义指针的解引用指针-整数void* 指针指针运算指针- 整数指针 - 指针指针的关系运算代码仓库内存和地址计算机中常见的单位1byte 8bit1KB 1024Byte1MB 1024KB1GB 1024MB1TB 1024GB1PB 1024TB内存大小32位机器如下图1.一个地址大小为一个字节计算机中的编址并不是把每个字节的地址记录下来而是通过硬件设计完成的。不同的机器寻址能力不同我们可以简单理解32位机器有32根地址总线每根线只有两态表示0,1【电脉冲有无】那么⼀根线就能表示2种含义2根线就能表示4种含义依次类推。32根地址线就能表示2^32种含义每一种含义都代表一个地址内存单元的编号 地址 指针指针变量和地址指针变量和解引用操作符*变量创建的本质就是在内存申请空间存放数据例如 int 申请四个字节的空间intmain(){inta10;int*pa;//编号 地址 指针//p被称为指针变量理解为存放指针的变量//指针变量也是变量,指针变量是专门用来存放地址的return0;}p 被称为指针变量理解为存放指针的变量 \color{blue}{p被称为指针变量理解为存放指针的变量}p被称为指针变量理解为存放指针的变量指针变量也是变量 , 指针变量是专门用来存放地址的 \color{blue}{指针变量也是变量,指针变量是专门用来存放地址的}指针变量也是变量,指针变量是专门用来存放地址的其中 i n t ∗ 说明 b 的类型是 i n t ∗ 说明 p b 是指针变量 p b 指向 b \color{blue}其中int*说明b的类型是int*说明pb是指针变量pb指向b其中int∗说明b的类型是int∗说明pb是指针变量pb指向b解引用操作符#includestdio.hintmain(){inta100;int*paa;*pa0;return0;}∗ p a 的意思就是通过 p a 中存放的地址找到指向的空 \color{red}{*pa 的意思就是通过pa中存放的地址找到指向的空}∗pa的意思就是通过pa中存放的地址找到指向的空∗ p a 其实就是 a 变量了 , 所以 ∗ p a 0 这个操作符是把 a 改成了 0 \color{red}{*pa其实就是a变量了,所以*pa 0这个操作符是把a改成了0}∗pa其实就是a变量了,所以∗pa0这个操作符是把a改成了0指针变量的大小32位机器假设有32根地址总线每根地址线出来的电信号转换成数字信号后是1或者0那我们把32根地址线产⽣的2进制序列当做⼀个地址那么⼀个地址就是32个bit位需要4个字节才能存储。如果指针变量是用来存放地址的那么指针变量的大小就得是4个字节的空间才可以。同理64位机器假设有64根地址线一个地址就是64个⼆进制位组成的⼆进制序列存储起来就需要8个字节的空间指针变量的大小就是8个字节。结论 \color{green}{结论}结论• 32位平台下地址是32个bit位指针变量大小是4个字节• 64位平台下地址是64个bit位指针变量大小是8个字节• 注意指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的。内存存放intmain(){intb0x12345678;int*pbb;return0;}内存 - 高地址存高位数64位数组随着下标的增长地址是由低到高变化内存的换算1指针变量类型的意义问题指针变量的大小和类型无关只要是指针变量在同⼀个平台下 大小都是⼀样的为什么还要有各种各样的指针类型呢指针的解引用//代码1#includestdio.hintmain(){intn0x11223344;int*pin;*pi0;return0;}//代码2#includestdio.hintmain(){intn0x11223344;char*pc(char*)n;*pc0;return0;}如果int类型用double类型指针还会导越界问题结论指针的类型决定了对指针解引用的时候有多大的权限一次能操作及个字节。比如 char* 的指针解引用就只能访问⼀个字节而 int* 的指针的解引用就能访问四个字节。指针±整数char* 类型的指针变量1跳过1个字节 int* 类型的指针变量1跳过了4个字节。这就是指针变量的类型差异带来的变化。指针1其实跳过1个指针指向的元素。指针可以1那也可以-1结论指针的类型决定了指针向前或者向后⾛⼀步有多大距离void* 指针v o i d ∗ 类型的可以理解为⽆具体类型的指针或者叫泛型指针这种类型的指针可以⽤来接受任意类型地址。 \color{blue}{void * 类型的可以理解为⽆具体类型的指针或者叫泛型指针这种类型的指针可以⽤来接受任意类型地址。}void∗类型的可以理解为⽆具体类型的指针或者叫泛型指针这种类型的指针可以⽤来接受任意类型地址。但是也有局限性 v o i d ∗ 类型的指针不能直接进行指针的 − 整数和解引⽤的运算。 \color{blue}{但是也有局限性 void* 类型的指针不能直接进 行指针的-整数和解引⽤的运算。}但是也有局限性void∗类型的指针不能直接进行指针的−整数和解引⽤的运算。⼀般 v o i d ∗ 类型的指针是使⽤在函数参数的部分⽤来接收不同类型数据的地址这样的设计可以实现泛型编程的效果。 \color{blue}{⼀般 void* 类型的指针是使⽤在函数参数的部分⽤来接收不同类型数据的地址这样的设计可以实现泛型编程的效果。}⼀般void∗类型的指针是使⽤在函数参数的部分⽤来接收不同类型数据的地址这样的设计可以实现泛型编程的效果。指针运算指针的基本运算有三种分别是 \color{navy}{指针的基本运算有三种分别是}指针的基本运算有三种分别是•指针 − 整数 \color{navy}{• 指针- 整数}•指针−整数•指针 − 指针 \color{navy}{• 指针-指针}•指针−指针•指针的关系运算 \color{navy}{• 指针的关系运算}•指针的关系运算指针± 整数因为数组在内存中是连续存放的只要知道第⼀个元素的地址顺藤摸⽠就能找到后⾯的所有元素#includestdio.h//指针- 整数intmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};int*parr[0];inti0;intszsizeof(arr)/sizeof(arr[0]);for(i0;isz;i){printf(%d ,*(pi));//pi 这⾥就是指针整数}return0;}指针 - 指针前提两个指针指向同一块空间否则不能相减//指针-指针#includestdio.hintmy_strlen(char*s){char*ps;while(*p!\0)//或者while(*p ! 0 )\0的ascll码为0p;returnp-s;}intmain(){printf(%d\n,my_strlen(abc));return0;}统计的是\0之前的元素个数指针的关系运算即为字面意思指针间的关系运算intmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};//打印数组的内容intszsizeof(arr)/sizeof(arr[0]);int*parr;while(parrsz){printf(%d ,*p);p;}return0;}代码仓库❄️Gitee仓库《C语言》《数据结构》其中1个十六进制位4个二进制位0.5个字节所以32位0xFFFFFFFF32/4八个64位则16个 -计算机中常见的单位1byte 8bit1KB 1024Byte1MB 1024KB1GB 1024MB1TB 1024GB1PB 1024TB ↩︎

更多文章