指针两个值 一个自身 一个指向
要不给他已有变量地址 要不给空指针
int *p ==Null
int *p =&a
不允许出现野指针
int a = 10;
int *p = &a;
int **s = &p
a=10
&a =0012ff28
*p=a=10
p=0012ff28
&p = 0012ff10
s=0012ff10
*s=0x0012ff28
**s=10
&s=0x0012ff04,
*s=p
**s=pa
&*p = &a
*&p =&a
乘法 声明 解引用
&取地址 位与 引用
名称 物理地址 值
变量存数值
一级指针存变量地址
二级存一级地址
s=上一个内存块的地址
*S = 上两个内存块的地址
**s=上两个内存块中的数据 前面没了
数组 属性 类型 大小 内存连续
[]前不是数组名 是首地址
ar[i]=* (ar+i)= i[ar]=* (ar+i)
只要有一个指针加一个变量 就可以使用a[b]模式
p = p+n // p = p + sizeof(type) * n
光有数据 没有类型 是没有意义的
预编译 替换#
编译 类型 语法 词法 检查
链接 链接动 静态库
可执行 代码 堆 栈 数据
typedef 会把一切合法的变量定义 转化成所对应类型
char ch = 10;
int a = 6;
char cp =&ch;
int *ip = &a;
ip = cp; 不同类型指针不能互相赋值 ip解释cp时候 在内存中要解释4字节 ch只有1字节 会解释不确定内容 打乱了内存解释 必须强制转换
a
b
b
d