一.内存的概念
(1 内存是电脑上特别重要的存储器,计算机中所有的程序都是在内存中运行的
(2 为了有效地使用内存,设计者将内存划分成一个一个小的内存单元,每一个内存单元的大小是1字节
(3 为了有效地访问到内存中的每一个单元。设计者将内存单元进行了编号,这些编号称为内存单元的地址
2.如何产生地址
32位/64位的区别
32位代表有32根地址线(数据线)
64为代表有64根地址线(数据线)
数据线需要进行通电,而一旦通电就有正电与负电之分,其中正电用1来表示,负电则用0来表示
则32位地址线中内容则有:
00000000000000000000000000000000
00000000000000000000000000000001
00000000000000000000000000000010
··································
11111111111111111111111111111111
总共有2^32种可能性,若使用单位bit(比特)则等于4,294,967,296,换算成byte(字节)则需要/8
计算得出536,870,912 byte 换算成kb(千字节)则需要 /1024 得到 524288 kb 换算成mb(兆字节)
需要 /1024 得出 512mb 也就是0.5GB,很显然0.5GB不能满足使用的需求,所以设计者使用byte(字节)作为内存的最小内存单元,将其换算成GB 大小为 4GB 可以满足使用的需求
二.指针的初识
(1.利用%p输出变量的地址
如int a = 10; 则为变量a申请了4个字节的内存,如以下代码:
#include<stdio.h>
int main(void)
{
int a = 10;
printf("address=%p\n",&a);
getchar();
return 0;
}
程序运行的截图:
注意!这里输出的值和图中输出的值不一样是很正常的,因为程序每次的运行所申请的内存地址都是不同的,例如这里是:0133FA88 ,这里输出的是16进制,可以用Windows自带的计算器进行换算,如图
这里进行解释一下Windows中自带的程序员计算器用法:
HEX:十六进制
DEC:十进制
OCT:八进制
BIN:二进制
由此可以得出变量a申请的内存地址为BIN选项中所输出的二进制数
回到程序源代码中,使用printf()函数时%p占位符用于打印变量的地址,&a中&为取地址符,意思是取得变量a的地址,并利用printf()函数进行输出
(2. 存放指针变量
在C语言中只要是数据就可以进行存储,如以下代码,对a的地址进行了存储
#include<stdio.h>
int main(void)
{
int a = 10;
int* p = &a;
printf("a address=%p\n",&a);
printf("p address=%p\n",p);
getchar();
return 0;
}
程序运行后我们发现,使用取地址符号&取得的变量a的地址与指针变量p输出的地址相同,如图所示:
int* p ----> 其中p为指针变量,类型为int* , 那么如何通过指针来修改a的值呢?,如下代码:
#include<stdio.h>
int main(void)
{
int a = 10;
int* p = &a;
*p = 20;
printf("%d\n",a);
getchar();
return 0;
}
这时候我们看一下a的值还是不是第四行中的10,运行结果很明显,a的值从10被改成了20,原因就在第六行代码中 *p=20;
*号是解引用操作符,通过p的解引用找到了地址所指向的对象,所以p =20 的意思是:对p进行解引用操作,找到*p所指向的对象进行修改
下面举一个例子:
#include<stdio.h>
int main(void)
{
char ch = 'x';
char* pc =&ch;
*pc = 'y';
printf("ch=%c\n",ch);
getchar();
return 0;
}
第四行创建了一个字符型变量ch,并将字符x赋值给变量ch,第五行创建了一个字符型的指针变量pc来获取并存储变量ch的地址,第六行使用 * 解引用操作符对指针变量pc进行解引用操作,这时候pc的值就等于ch的值,将字符 y 赋给指针变量pc,而指针变量pc由于已经被解引用操作了,所以其值指向的是字符型变量ch,所以最终打印出来的结果为y
三.指针的大小
执行以下代码可以获取当前系统上每一个指针类型所占用的内存空间
#include<stdio.h>
int main(void)
{
printf("%d\n",sizeof(int *));
printf("%d\n",sizeof(char *));
printf("%d\n",sizeof(short *));
printf("%d\n",sizeof(double *));
printf("%d\n",sizeof(float *));
return 0;
}
结论:在32位平台中指针占用内存4个字节,在64位平台中指针占用内存8个字节
我们可以更改我们的编译器设置,对编译平台的位数进行调整,如下图:
点击上方的Win32按钮,点击配置管理器
选择活动解决方案平台,选择新建
新平台选择x64即可改为64位平台
2023/7/16
王起舟