一、地址
不管是指针还是数组定义后一定要初始化啊!!!!!!!!!!!!!!!!
//打印地址的方法 %p
int a=0;
printf("a=%d\n",*(&a));//&代表取地址,*代表取一个地址里的值(内容)
int a=3;
int *p=&a;
printf("a的地址:%p\n",&a);
printf("a=%d\n",*((int *)0x000000000064FE14));//(int *)将后面的16进制数转换为地址,
//*代表取一个地址里的值(内容)
二、指针变量的定义
int a=10;
int *p;//或 int *p;
//初始化
int *p=&a;
p=&a;//*p=&a是万万不可的
星号(*)只有在定义一个指针变量时才是指针的标识符,其他情况都是
取内容的运算符!!!
三、数组的访问方式
int a[3]={1,2,3};
int *p=&a[0]; //数组首元素地址=数组地址=数组名
//1.直接通过数组访问
for(int i=0;i<3;i++){
printf("%d\n",a[i]);
}
//2.利用指针访问
for(int i=0;i<3;i++){
printf("%d\n",*p++); //指针分类型,指针++根据类型的不同偏移值不同
}
p=a;//数组首元素地址=数组地址=数组名
//3.数组指针当数组名来用,
for(int i=0;i<3;i++){
printf("%d\n",p[i]);
}
四、为什么要用指针?
1.可以在你想要的地址的地方写入数据,这也是c语言指针的强大之处,Java做不到;
//ARM架构 裸机编程 ARM驱动
int *p=(int *)0x000000000064FE1C;
*p=1;//这里不知道为什么我的DevC++会报段错误
printf("%p,%d\n",p,*p);
//但是一般要加volatile,其作用是提升程序正确度,但会牺牲一点的效率,
//详情:https://blog.csdn.net/joy2017/article/details/83583984
volatile int *p=(volatile int *)0x000000000064FE1C;
int *p=(int *)0x000000000064FE1C;
*p=1;
printf("%p,%d\n",p,*p);