返回

p21.p22_指针

发布时间:2023-05-02 15:05:13 346
# c++# 数据

1.什么是指针?

指针就是一个变量,用来存放地址

通过指针就能找到以它为地址的内存单元,就能取到存在这个内存单元里面的数据

问题2:一个内存单元该多大?

//1个内存单元的大小最好是1个字节
//
//对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);
//那么32根地址线产生的地址就会是:
//00000000 00000000 00000000 00000000
//11111111 11111111 11111111 11111111
//这里有2的32次方个地址。
//1Byte = 8bit(位),1024Byte(字节) = 1KB,1024KB = 1MB,1024MB = 1GB,1024GB=1TB
//1字节=1024/1KB=(1024*1024)/1MB=(1024*1024*1024)/GB
//所以,如果一个地址标识一个字节,那么2的32次方的地址标识:2的30次方个字节也就是1GB*4=4GB 能编制4GB空间

问题3:指针多大?

//首先要知道指针是用来存放地址的。
//如果机器有32根地址线,那么产生2的32次方个地址,但是每个地址都是32位的,也就是4个字节,所以指针在32位平台是4个字节
//同理,指针在64位平台,指针是8个字节,才能存放一个地址
int a=10;
int* pa=&a;
printf("%d\n",sizeof(pa));

2.指针类型的实际意义?

a.指针的解引用操作

a.指针类型决定了:指针进行解引用操作时候能够访问的空间大小

//  //计算各种指针类型的大小
// printf("%d\n", sizeof(int*));
// printf("%d\n", sizeof(char*));
// printf("%d\n", sizeof(short*));
// printf("%d\n", sizeof(double*));
拓展:
//因为:1个16进制位=4个2进制位
//所以:2个16进制位=8个2进制位
//又因为:8个2进制位就是一个字节
//所以:2个16进制位就是一个字节

int a = 0x11223344;//这里a占4字节空间

int *pa = &a; //取地址a,放到int*里面去
char* pc = &a;//取地址a,放到char*里面去
short* ps = &a;//取地址a,放到short*里面去

//*pa=0;//pa解引用,能访问4个字节的内容,所以a被赋值为0
*pc=0;//pc解引用,能访问1个字节的内容,a被修改为0x11223300

//首先pa和pc都能存放a的地址
// printf("%p\n",pa);//打印pa地址
// printf("%p\n", pc);//打印pc地址
//
// //打开调试窗口(F10)
// //调出内存窗口 - 调试 - 窗口 - 内存
// //在内存数输入取地址a:&a

//应用:如果你希望从这个位置向后访问1个字节,就把这个变量交给char类型指针
//如果你希望从这个位置向后访问2个字节,就把这个变量交给short类型指针
//如果你希望从这个位置向后访问4个字节,就把这个变量交给int类型指针
//如果你希望从这个位置向后访问8个字节,就把这个变量交给double类型指针

b.指针+-整数时的步长

b.指针类型决定了:指针+-整数时跳过多少字节

b.指针类型决定了指针向前或向后走一步有多大距离

int a=0x11223344;
int* pa=&a;//定义一个int*类型指针
int* pc=&a;//定义一个char*类型指针
printf("%p\n",pa);
printf("%p\n", pa+1);//指针跳过一个整型(4个字节)
printf("%p\n", pc);
printf("%p\n", pc+1);//指针跳过一个字符(1个字节)
int main()
{
int arr[10]=0; //定义一个10元素的整型数组
int* pa=arr;//pa是int*类型指针
int i=0;
for(i=0;i<10;i++)
{
*(pa++)=1;//将数组元素赋值为1,然后指针+1,即指针跳过4个字节,即指针跳过一个整型指向下一个元素
}

}
int main()
{
int arr[10]=0; //定义一个10元素的整型数组
char* pc=arr;//pa是char*类型指针
int i=0;
for(i=0;i<10;i++)
{
*(pc++)=1;//pc是一个字符类型指针,指针+1只跳过1个字节,
//循环结束一共修改了10个字节的空间
}
//循环结束,数组元素为:
//0x1010101、0x1010101、0x0101、0x0、0x0........

}

3.什么是野指针?

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

也就是说野指针存放的地址是随机的

a.指针未初始化

#include
int main()
{
int* p;//局部变量指针未初始化
*p=20;
return 0;
}
b.指针越界访问

#include
int main()
{
int arr[10]={0};
int* parr=arr;
int i=0;
for(i=0;i<=11;i++)
{
//当parr指向的范围超出arr的范围时,parr就是野指针
*(parr++)=i;
}

return 0;
}
c.指针指向的空间释放
int* test()//函数返回值是整型a的地址,所以用int*类型
{
int a=10;
return &a;//返回地址a,函数结束,空间释放
}
int main()
{
int *p=test();//地址已返回,但是函数一结束&a这块空间就还给系统了,释放了
*p=20;//通过*p找的空间已经变成别的空间了,
}
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
比较三个数的大小 2023-05-02 12:05:02