内存
计算机中的内存参考现实生活中的房间,编号来存储。
怎么编号?
32位机---,64位机---
以32位机为例,32位机---32根地址线---物理线--通电---正负信号1/0,于是就可以产生从00000000000000000000000000000000到1111111111111111111111111111111111111111的不同信号,把这2^32个不同的信号当做地址来给内存单元编码。
每个内存单元存储的空间是多大?一个内存单元是一个字节
-------------------------------------------------------------------------------------------------------------------
%p,用来打印地址的格式占位符
int a=10;
a为整型,占了4个字节,也就是占了4个内存单元,但是打印a的地址时,我们只需要知道a的第一个字节地址即可,剩下的三个地址为依次递增。
同理,int arr[ 5]={ 0};
arr[0],与arr[1]的地址相差了4个字节。
---------------------------------------------------------------------------------------------------------------
假设有一个变量p1用来存储a的地址,那么这个p1就叫做指针变量,声明格式如下。
int *p1= &a;
&a为取出a的地址
p1说明p1是一个指针变量。p1的数据类型为int *
int* 说明指针变量p1指向的是一个整型数据。
指针变量的数据类型必须要与指向对象的数据类型相同
---------------------------------------------------------------------------------------------------------------
int a=10;
int *p1=&a;
*p1=20;
第三行代码中,*叫做解引用操作符,*p1就是通过p1里面的地址找到a,最终将20赋给a。
指针的声明有两种形式,
一种为 int *p1=&a;
一种为int *p1;p1=&a;
只有成功初始化*p1以后,才能对*p1赋值,此时相当于间接对a赋值
不能写成 int *p1;*p1=a !!!!!!
不能对指针变量赋值!!!!,即不能写成p1=100;
使用%d打印p1时,得出的是一个随机数,因为p1的数据类型是int*
同时,*p1自身也有一个存放地址
指针本身的大小与32位机/64位机有关,32位机时统一为4字节,64位机时统一为8字节。vs2022在编程界面上方选择x86为32位机,选择x64为64位机。