非常重要!!!
内存,是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的
为了有效地使用内存,就把内存分成一个个小的单元,每个单元的大小就是1字节
为了能够有效的访问到内存的每个单元,就给内存进行了编号,这些编号被称为该内存单元的地址
内存属于空间,和现实生活中空间的使用非常相似,都取的有名字
两个问题
-
内存是怎么编号的
-
一个内存单元是多大空间
32位计算机 - 有32根地址线 - 物理线 - 通电 - 1/0
我们把电信号转化成数字信息,就变成0和1的二进制序列
00000000000000000000000000000000
...
01111111111111111111111111111111
10000000000000000000000000000000
...
11111111111111111111111111111111
有2^32种情况
这就是内存编号
内存编号就是内存单元的地址
一个内存单元给多大空间呢?
一共有2的32次方个内存单元
如果假设一个内存单元是1bit
就可以管理2的32次方bit的空间大小
可以管理4,294,967,296bit
= 536,870,912 Byte
= 524,288MB
= 0.5GB
太小了朋友,如果不直观的话,那么朋友,你想想在C语言中,一个char类型就要1Byte,就是八个bit,要给八个地址,是不是太浪费了?
最终,一个内存单元是一个字节(八个比特)
//指针 int main() { int a = 10;//a在内存中要分配空间的 - 4字节 //只会拿出第一个字节的地址 printf("%p", &a);//%p专门用来打印地址 int * pa = &a;//pa是用来存放地址的,在C语言中叫指针变量 //*说明 pa是指针变量 //int说明pa执行的对象是int类型的 char ch = "w"; char * pc = &ch; return 0; }
指针变量可以存放自身的地址吗?
int main() { int* pa = &pa; return 0; }
可以放但是很奇怪,而且有警告,*和**类型不同,只是把数值放进去了
指针变量
int main() { int a = 10; int* pa = &a; *pa = 20;//*解引用操作,*pa就是通过pa里面的地址找到a printf("%d", a); return 0; }
解引用操作符 *
指针变量有多大?
int main() { printf("%d\n", sizeof(char*)); printf("%d\n", sizeof(short*)); printf("%d\n", sizeof(int*)); printf("%d\n", sizeof(long*)); printf("%d\n", sizeof(long long*)); printf("%d\n", sizeof(float*)); printf("%d\n", sizeof(double*)); return 0; }
直接看结果
8 8 8 8 8 8 8
指针的大小是相同的
指针是用来存放地址的
指针有多大区别于地址有多大
地址的存储需要多大空间
64个bit位 需要8个字节
暂时关于指针就点到为止,未来再详细写这方面的知识!!!