建设网站对于客户,网站权限查询,网站不备案什么意思,网易与暴雪合作1.指针是什么
#xff08;指针是内存中一个最小单元的编号,也就是地址#xff09; int main()
{int a10;//当我们取出地址a的时候,取出的其实是a占4个字节中的第一个字节的地址int *paa;//pa是一个指针变量,用于存放地址//pa在口头语上常说为指针//指针本质上就是地址,…
1.指针是什么
指针是内存中一个最小单元的编号,也就是地址 int main()
{int a10;//当我们取出地址a的时候,取出的其实是a占4个字节中的第一个字节的地址int *paa;//pa是一个指针变量,用于存放地址//pa在口头语上常说为指针//指针本质上就是地址,口语上的指针是指针变量,用于存放地址reruen 0;
) (平时口语常说的指针,通常指的是指针变量,是用来存放内存地址的变量)
关于指针的大小的解释
//假设在32位的机器上经行编码,这个机器产生的地址之可能是
00000000 00000000 00000000 00000000//32个bit位
00000000 00000000 00000000 00000001
......
11111111 11111111 11111111 11111111
共有2^32次方个地址,每一个地址能管理一个字节
经过换算2^32字节4GB
可知在32位的机器上,地址是32个0或1组成的二进制序列,那地址就得用
4个字节的空间来储存,所以在一个指针变量的的大小是4个字节
同理,在64位的机器上,一个指针变量的大小为8个字节 ---------------------------------------------------------
例子
#includestdio.h
int main()
{char *pc0;int *ps0;double *pi0;short *pd0;printf(%d\n,sizeof(pc));printf(%d\n,sizeof(ps));printf(%d\n,sizeof(pi));printf(%d\n,sizeof(pd));return 0;}
8
8
8
8--------------------------------
Process exited after 0.07514 seconds with return value 0
请按任意键继续. . .2.指针和指针类型
指针类型决了指针在被解引用的时候访问几个字节
如果是int*型的指针,解引用访问4个字节;如果是char*型的指针,解引用访问1个字节(指针的类型决定指针变量访问的字节数或者说1时跳过的字节数)
ps:int类型与float类型虽然所占用的字节大小一样,但是不能通用,
如果给int型的指针变量赋值100.0,则该指针变量的值不一定为100.0
#includestdio.h
int main()
{int a0x11223344;char *pc(char*)a;int *psa;printf(pc%p\n,pc);printf(pc1%p\n,pc1);printf(ps%p\n,ps);printf(ps1%p\n,ps1);return 0;}
pc000000000062FE0C
pc1000000000062FE0D
ps000000000062FE0C
ps1000000000062FE10--------------------------------
Process exited after 0.07891 seconds with return value 0
请按任意键继续. . .
//可知指针的类型决定了指针加一减一操作的时候,跳过几个字节
3.野指针
概念:(指针指向的位置时不可知的) 例如
int main()
{int *p;p没用初始化,意味着没有明确的方向*p10;//非法访问内存,局部变量不进行初始化存放的时随机值return 0;
}
---------------------------------
指针的越界访问
int main()
{int arr[10]{0};int *p;int i0;for(i0;i10;i){*pi;p;}return 0;}
----------------------
例
#includestdio.h
int *test()
{int a10;return a;//a在函数调用后还给操作系统了,在本程序中
没有该空间使用权限,a在内存的空间还在
}
int main()
{int *ptest();//再调用*p,则*p成为也指针 printf(%d\n,*p);//虽然调用后没有使用权限了,但在a原来的地址没用被占用
之前,还能通过*p找到a的地址与值return 0;}
------------------------
为了避免野指针的出现,对于暂时不知道赋值为什么的指针我们可以赋值为NULL
如何避免野指针
1.指针初始化
2.注意指针越界
3.避免返回局部变量的地址
4.指针指向NULL
5.检测指针的有效性 4指针运算
指针-(加减)整数.
指针-(减)指针.
指针的关系运算
#define N_VALUES 5
float values[N_VALUES];
float *v;
for(vvalues[0];vpvalues[N_VALUES];)//v小于values[N_VALUES]的地址
{*v0;//该行代码可分为两步理解1.*v0 2.v
}//值得注意的是,虽然N_VALLUES的下标值有到5,但是内存中有接下来的内存,所以在里步存在野指针
-------------------------------------------------
int main()
{int arr[10]{0};int i0;int *parr;int szsizeof(arr)/sizeof(arr[0]);for(i0;i10;i){*p1;//
*p11;p;} return 0;}
5.指针和数组
6.指针数组