一.指针是什么?
对于初学者来说,最容易弄混的就是指针的含义,导致错误的应用,因此我们今天先来讲讲指针是什么。
指针理解的2个要点:
1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中我们说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量。
内存与指针变量
内存
指针变量
我们可以通过&(取地址操作符)取出变量的内存起始地址,把地址可以存放到一个变量中,这个变量就是我们的指针变量
#include <stdio.h> int main() { int a = 10;//在内存中开辟一块空间 int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。 //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个之指针变量。 return 0; }
总结:
指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
那这里的问题是:
一个小的单元到底是多大?(1个字节)
又如何编址?
经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);
那么32根地址线产生的地址就会是:
64位机器同理,有64位地址线,这里仅以32位机器为例。
二进制,由于有32根地址线,所以一共有2的32次方个字节的空间,也就产生了这么多的编号。
我们知道(2^32Byte = 2^32/1024KB =2^32/1024/1024MB = 2 ^32/1024/1024/1024GB = 4GB)
此时我们就能给4GB的空间进行编址。
这里我们就明白:
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
总结:
指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
指针的大小在32位平台是4个字节,在64位平台是8个字节
二.指针和指针类型
与变量相同,指针也有不同的类型。
int *p; //定义一个指针变量P,指向整形变量 char *p; // 定义一个指针变量p,指向字符型变量 float * p; // 定义一个指针变量p,指向单精度浮点型变量 double *p1, *p2; //定义两个指针变量p1和p2,指向双精度实型变量
这里可以看到,指针的定义方式是: type + * 。(type指类型名)
指针±整数
我们来看一下代码:
#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; }
这里的%p是打印地址的意思。
1.我们从打印结果可以看出&n与pc的地址是相同的,也就是说两者指向同一处。(这里由于n是int类型,我们需要将它强制类型转换成char类型再使用)
2.由2和3我们可以看出指针加1也就是地址加1即地址指向朝后的一位。
- 3.从3,4,5我们可以看出,不同类型的指针加1朝后跨越的地址是不同的,与指针变量的类型有关。
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)
但是,这里我们要知道,在相同的操作系统下,指针变量的大小都是相同的!
指针变量的大小
上面我们讲了指针在内存中存放的方式以及存储的空间大小,空间有多大自然就有多大的地址,也就是有多大的指针。
用代码测试一下:
#include <stdio.h> //指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节) int main() { printf("%d\n", sizeof(char *)); printf("%d\n", sizeof(short *)); printf("%d\n", sizeof(int *)); printf("%d\n", sizeof(double *)); return 0; }
我的电脑是64位平台,因此指针的大小为8个字节
总结:
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
指针的解引用
#include <stdio.h> int main() { int n = 0x11223344; int* pi = &n; *pi = 0; char* pc = (char*)&n; *pc = 0; return 0; }
以上是pi在内存中的存储,当我们把pi中的值改为0后
4个字节中存放的数据全部被改为0
以上是pc在内存中的地址,我们可以看到当也把地址中的数据改为0后,却只改了一位字节的地址.
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char * 的指针解引用就只能访问一个字节,而 int * 的指针的解引用就能访问四个字节。
总结
今天的内容暂时到这里就结束了,我们今天先讲了指针的定义,类型,大小,以及不同类型的指针的不同之处,剩下的部分我们分批次后续进行讲解
好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**