非常重要!!!
内存,是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的
为了有效地使用内存,就把内存分成一个个小的单元,每个单元的大小就是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个字节
暂时关于指针就点到为止,未来再详细写这方面的知识!!!
本文解释了内存的工作原理,包括如何通过地址线编号每个内存单元,以及在32位计算机中每个单元对应的空间大小。同时讨论了指针的概念,如指针变量的存储大小、解引用操作及其与内存地址的关系。

被折叠的 条评论
为什么被折叠?



