11-初识指针
指针
内存(C语言是可以对内存进行直接修改的)
内存是电脑上最重要的存储器,计算机中所有程序的运行都是在内存中进行的。所以为了有效地使用内存,就把内存划分为一个个小小的内存单元,每个内存单元的大小是一个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称之为内存单元的地址
内存的使用和我们现实生活中空间的使用有一定类似的地方

内存是怎么编号的?
32位机器是指32根地址线,32根物理线,32根物理线通电会产生1/0
64位机器是指64根地址线,64根物理线,64根物理线通电会产生1/0
正点1,负电0.如果32根线全是负电0,则为0
=========================================
电信号转换成数字信息:1和0组成的二进制序列
所以对于32位机器,可以使用2^32次方进行编号
2^32=0001 0000 0000 0000 0000 0000 0000 0000 0000
转成十进制就是4294967296 Bit/8=536870912 Byte /1024 = 524288 Kb/1024=512 Mb /1024 =0.5Gb
所以32位电脑可以分配0.5GB个空间
0.5GB*8=4G,所以32位电脑最高支持4GB电脑
一个这样的内存单元是多大空间
一个内存单元是一个字节(1Byte=8bit)
举例
#include <stdio.h>
int main()
{
int a = 10;
return 0;
}
在VS中,F10调试,打开监视和内存两个窗口,搜索框输入&a。便可以看到变量a在内存中的地址。因为a是整型,在内存中占4个字节。而取地址符&取的只是4个字节中的第一个地址。
%p是专门用来打印地址的
#include <stdio.h>
int main()
{
int a = 10;
printf("%p\n",&a);
return 0;
}

指针的使用
#include <stdio.h>
int main()
{
int a = 10;
printf("%p\n",&a);
int * pa = &a;//此时pa是用来存放变量地址,在C语言中,此时此刻,pa叫做指针,指针不等于变量地址,指针只是用来存放变量地址的一个容器.*说明pa是指针变量,int说明pa指向的对象是int类型。
char zifu = "zifu";
char* zifu_zhizhen = &zifu;
return 0;
}
注:指针不能指向自己
解引用操作符
#include <stdio.h>
int main()
{
int a = 10;
int * pa = &a;//此时pa是用来存放变量地址,在C语言中,此时此刻,pa叫做指针,指针不等于变量地址,指针只是用来存放变量地址的一个容器.*说明pa是指针变量,int说明pa指向的对象是int类型。
*pa = 20;//*在这里叫做解引用操作符 *pa就是通过pa里面的地址找到a。所以这里可以理解位*pa=a=20
printf("%d\n",a);
return 0;
}

所以从上图中可以看出来,指针就是存放地址的容器。
指针的大小
指针的大小都是相同的,指针是用来存放地址的。指针有多大取决于地址的存储需要多大空间。。32位机器上需要4个字节(32bit/8bit(内存单元大小))。64位电脑上是需要8个字节(64bit/8bit(内存单元大小))
在VS中,我们可以随意切换X86/64平台。以此模拟在32位/64位机器上的表现

#include <stdio.h>
int main()
{
int a = 10;
int * pa = &a;//此时pa是用来存放变量地址,在C语言中,此时此刻,pa叫做指针,指针不等于变量地址,指针只是用来存放变量地址的一个容器.*说明pa是指针变量,int说明pa指向的对象是int类型。
*pa = 20;//*在这里叫做解引用操作符 *pa就是通过pa里面的地址找到a。所以这里可以理解位*pa=a=20
printf("%d\n",a);
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;
}


VS不能切换32/64
打开配置管理器



浙公网安备 33010602011771号