目录
指针概述
指针的取值范围(步长)
?指针+1
指针概述
#include <stdio.h>
int main()
{
//物理内存:真是的内存
//虚拟内存:系统虚拟的内存(映射)
//指针操作的时虚拟内存(大部分情况下)
//32位系统的寻址范围 0x00 00 00 00 到 0xff ff ff ff(一个十六进制四位,两个十六进制一字节)
// 32/8=4 一字节8位 32位也就是四个字节,指针大小的由来
//0xff ff ff ff也就是32位最大的寻址,换算下来差不多4G,这也是32位系统内存即使大于4G也用不到的原因
//计算机是以字节为单位存储的
//总的来说内存地址就是指针,指针就是内存地址
//变量num存储的是10
int num = 10;
//变量p存储的是num的地址
//变量p存储的是num的首地址
//int(四字节)决定这个指针的取值范围(也叫指针的步长),类型决定解析方式
int* p = #
//他们两个输出的结果是一样的
printf("&num = %p\n", &num);
printf("p = %p\n", p);
//可以使用*(解引用运算符)来取出地址内的数据
printf("*p = %d\n", *p); //10 p存的是num的地址,*p就是按照p所存的地址去找到数据
//将指针p解引用后赋值可以改变num,但是不会改变地址
*p = 20;
printf("num = %d\n", num);
printf("*p = %d\n", *p);
printf("&num = %p\n", &num);
printf("p = %p\n", p);
//将num赋值可以改变*p,同样不会改变地址
num = 30;
printf("num = %d\n", num);
printf("*p = %d\n", *p);
printf("&num = %p\n", &num);
printf("p = %p\n", p);
//*p == num 值
//p ==&num 地址
//输出的是变量num的地址
printf("p = %p\n", p);
//输出的是(指针)变量p的地址
printf("&p = %p\n", &p);
return 0;
}
指针的取值范围(步长)
#include <stdio.h>
int main(int agec, char** argv)
{
//四字节 两个十六进制一个字节 这个很重要
int num = 0x11223344;
//int取四字节
int* p = #
printf("%#x\n", *p); //0x11223344
//short取两字节
short* p2 = #
printf("%#x\n", *p2); //0x3344
//char取一字节
char* p3 = #
printf("%#x\n", *p3); //0x44
//说下大端小端,
//大端只有一些服务器才会使用,大多数都是小端,至于为什么会有大端小端的问题这是历史遗留问题
//大端(低字节存高位数据,高字节存低位数据)
//小端(低字节存低位数据,高字节存高位数据)
return 0;
}
小端(低字节存低位数据,高字节存高位数据)
?指针+1
#include <stdio.h>
int main(int argc, char** argv)
{
int num = 0;
int* p = #
//每次地址不一样,但是效果一样,都是加类型的字节数
//+4
printf("%u\n", p); //10221728
printf("%u\n", p + 1); //10221732
short* p2 = #
//+2
printf("%u\n", p2); //10221728
printf("%u\n", p2 + 1); //10221730
char* p3 = #
//+1
printf("%u\n", p3); //10221728
printf("%u\n", p3 + 1); //10221729
return 0;
}
|