内存:

内存是电脑上特别重要的存储器,计算机中所有的程序的运行都是在内存中进行的.
在这里插入图片描述

为了有效地使用内存,就把内存划分为一个个小的内存单元,每个内存单元的大小是 一个字节,为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该 内存单元的地址
在这里插入图片描述如果假设:一个内存单元是1bit
二进制数2的32次转换成10进制数后是4294967296
4294967296 bit
/8 = 536870912 byte
/1024 = 524288 kb
/1024 = 512 mb
/1024 = 0.5gb
可见当一个bit是一个内存单元时:计算机可管理的内存太小了
并且一个char 占一个字节 = 8 bit ------ 8个地址 离谱!!
那么一个内存单元是一个字节时
char 占一个字节 = 1type ----------1个地址 合理!!
最终,一个内存单元是一个字节(一个字节给一个编号),然后分配地址的*

举个例子:

# include<stdio.h>
int main() {
	int a = 10;
	return 0;
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述内存中数据以二进制存储
如:10的二进制是00000000 00000000 00000000 00001010
转换为16进制: 00 00 00 0a
在内存中倒着展示:0a000000

指针:

指针就是地址,地址就是指针,存放指针的变量就是指针变量
在这里插入图片描述

# include<stdio.h>
int main() {
	int a = 10; //a在内存中要分配空间的   -4个字节
	printf("%p", &a);//%p是专门用来打印地址的,并且打印出的是4个字节中
					 //第一个字节的地址
	int* p = &a; //p是用来存放指针的,在c语言中p是指针变量
	//* 说明p是指针变量
	// int 说明p指向的对象是int 类型的
	*p = 20;//通过p访问a的地址并把20赋值给a,
	// *是解引用操作 *p就是通过a里边的地址,找到a
	pritnf("%d", a);
	return 0;
}

在这里插入图片描述在这里插入图片描述*p 解引用操作,通过访问p里面存放的地址访问p所指向的对象
p 就是p所指向的对象
p = 10;
指针的大小:

# include<stdio.h>
int main() {
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(long*));
	printf("%d\n", sizeof(long long*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));
	return 0;
}

在这里插入图片描述64位计算机为8,32位计算机位4
两个十六进制位占1bite
一个十六进制位有4个二进制位
因为二进制要表示数字10时为1100,占用4个二进制位
指针的大小是相同的!
因为指针是用来存放地址的,指针需要多大空间,取决于 地址的存储需要多大空间,32位机器是 32个比特位组成的二进制序列作为一个地址,同理64位机器是 64个比特位组成的二进制序列作为一个地址
32位 32bit -4 type
64位 64bit -8 type

指针的意义

指针类型决定了指针在被解引用的时候访问几个字节
如果是int* 的指针,解引用访问4个字节
如果是char* 的指针, 接引用访问1个字节
可推广到其他类型