目录
本文约万字内容,详细梳理了指针与数组,诚意满满,若对文章给予认可,可以点个赞谢谢
一,指针是什么
指针理解的2个要点:
- 指针是内存中一个最小单元的编号,也就是地址
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量
一个字节一个精确的地址,就像一户人家一个门牌号,这样我们就能通过门牌号找到里面的人
1,一个小的单元到底是多大?(1个字节)
因为经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。
2,如何编址?
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0)
那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111
这里就有
2
的
32
次方个地址。
每个地址标识一个字节,那我们就可以给
4G
的空闲进行编址。64
位机器,如果给
64根地址线,就可以给
4G
的空闲进行编址。
这里我们就明白:
在
32
位的机器上,地址是
32
个
0
或者
1
组成二进制序列,那地址就得用
4
个字节的空间来存储,所以
一个指针变量的大小就应该是
4
个字节。
那如果在
64
位机器上,如果有
64
个地址线,那一个指针变量的大小是
8
个字节,才能存放一个地
址。
总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的
指针的大小在
32
位平台是
4
个字节,在
64
位平台是8个字节
二,指针和指针类型
1,指针运算符
- 取地址运算符&: 用来取对象的地址 栗:&i为取变量i的地址
- 间接访问操作符 * : 与&相反,操作对象地址,获取地址存储的内容 栗:a=&i,指针变量a 存储变量 i 的地址,*a 则是找到指针变量a存储的地址,然后将内容取出。
2,指针类型的意义
char *p
int *p
short *p
long *p
float *p
double *p
这里我们可以看到,指针类型的定义就是:类型就是 + *
- char* 类型的指针是为了存放 char 类型变量的地址
- int* 类型的指针是为了存放 int 类型变量的地址
- 也就是什么类型的指针就是为了存放相应类型的地址
那指针类型的意义是什么?
实验1:
这里我们查看了编译器中 a 的内存大小(右边红字部分),初始值是0x11223344
经过int * 类型的指针,赋值后四个字节都变成了0。
这里我们将指针类型变成了char * ,结果只有一个字节变成了0,
实验2:
#include<stdio.h>
int main()
{
int n = 10;
char* p1 = (char*)&n;
int* p2 = &n;
printf("%p\n", &n); //000000917452F804
printf("%p\n", p1); //000000917452F804
printf("%p\n", p1 + 1); //000000917452F805
printf("%p\n", p2); //000000917452F804
printf("%p\n", p2 + 1); //000000917452F808
return 0;
}