指针 : 地址 的代名词 , 在32位系统中,指针就4个字节;
指针变量 : 存放指针这个概念的盒子
指针每次读取的数据大小,取决于定义指针的数据类型;(int *p ; char *p)
#include "stdio.h" int a=0x213432; int *p1; void main() { p1=&a; printf("%x\n",*p1); }
结果:213432
int a=0x213432; char *p1; void main() { p1=&a; printf("%x\n",*p1); }
编译会出现警告warning: assignment from incompatible pointer type,
结果为32.
指针+修饰符
- const 常量,只读【不能变】
char *p;
const char *p; p可以指向任意空间,但不希望改变其中的内容(与char const *p相同 )
char * const p : p一旦被赋值,将永远指向这个地址,但内容可以改变(与 char *p const相同 ) 硬件资源
const char * const p : ROM
- volatile 防止优化指向内存地址
volatile char *p
- typedef 别名
指针+运算符
- 加减运算 指针的加法/减法运算,实际上是增加一个单位(由定义指针的数据类型控制,大小可以使用 sizeof (p[0]) )
int *p = xxx [0x12]
p+1 [0x12+1*(sizeof(*p))]
p++ p-- :更新地址
- 【】 变量名【n】
n : ID 标签 地址内容的标签访问方式 取出标签内存 里的值
适用于跳跃式访问,非线性
1 #include"stdio.h" 2 3 void main(){ 4 5 int a= 0x12345678; 6 int b= 0x81234548; 7 8 int *p1 = &b; 9 char *p2 = (char *)&b; 10 11 printf("the p1+1 is %x,%x,%x\n",*(p1+1),p1[1],*p1+1); 12 13 printf("the p2+1 is %x\n",p2[1]); 14 }
结果为:
the p1+1 is 12345678,12345678,81234549
the p2+1 is 45
- 逻辑操作符
>= <= == !=
*p1>*p2 地址中的内容的比较
常用: ---------------------- == !=
1.跟一个特殊值进行比较 0x0 :地址的无效值,结束标志。 一般用 NULL表示0
2.指针必须式同类型的比较才有意义,
多级指针
存放地址的地址空间。(主要强调一个 联系 ) char **p (第二个* 修饰p,表示为指针,char修饰第一个*,表示二级指针的操作单位),指针结束条件为空。eg: while (p[m] != NULL)