指针就是变量的地址,指针变量是专门用来存储地址的变量,有着自己的尺空间和内存编号。
指针变量是在内存中开辟一个空间,该空间是用来存放地址信息。其实指针变量存的是指针。
相关操作符:
1、&:取地址符,获取变量的地址,对于多节的变量,取地址得到的是首地址,即地址低位。
2、*解引用符,在定义指针变量的时候,*只起到标识作用,标识定义的是一个指针变量,其他场景下,表示操作指针指向空间的内容。
例:
int *p = &a;
p = &b;
int *q = p;
1、定义一个指针变量P,此时*起标识作用,&a为取变量a的地址,即定义了一个指针变量p,并把变量a的地址赋值给指针变量p,或者说指针p指向了变量a。
2、把b的地址赋值给指针变量p,或者说指针p指向了变量b
3、定义了一个指针变量q,并将p的内容赋值给了q。其实在这里p里面的内容应该是地址
int main()
{
int a=100;b=10;
int *p1,*p2; //定义指针变量
P1 = &a; //将变量a地址赋给指针变量P1
P2 = &b;
printf("a=%d,b=%d",a,b);
printf("*p1=%d,*p2=%d",*P1,*P2); //指针变量前面加* 取值指针变量指向地址的数值。
}
100,10
100,10
C语言具有访问地址的能力,因此C语言可以直接通过访问地址访问内存。
*(uint8_t *)0x20000550 = 10;
printf("value = %d\r\n", *(uint8_t *)0x20000550);
(uint8_t*):类型强制转换,强制转换成一个uint8类型的地址
(uint8_t *)0x20000550 强制将0x20000550转换成一个uint8_t的地址
*(uint8_t *)0x20000550 指针指向这个地址,其实是这个地址对应的数据
*(uint8_t *)0x20000550 = 10 将10赋给指针所指的地址,
*(uint8_t *)0x20000550 = 10;
printf("value = %d\r\n", *(uint8_t *)0x20000550);uint8_t *p;
p = (uint8_t *)0x20000550;
printf("*p = %d\r\n", *p);uint8_t a;
a = 15;
printf("a = %d\r\n", a);
value = 10
*p = 10
a = 15