C语言笔记-7-内存空间-指针
前言
自学笔记,没有历史知识铺垫(省略百度部分),C语言指针的使用
一、概念
1.* 指针
- 指针: 内存资源的地址
- 指针变量:存放指针的盒子 32位操作系统中,其大小位32bit,即4个字节,64位为64bit,即8个字节,与指针数据类型无关
- 指针的数据类型: 表示指针要读取的地址字节数,如:
char *p; 读取1个字节,int *p 读取4个字节,具体选择根据指向的变量调整 - 指针指向的内存空间一定要合法(存在,且有读的权限)
int main()
{
int *p1;
char *p2;
printf("p1:%lu,p2:%lu \n",sizeof(*p1),sizeof(*p2));
return 0;
}
指针变量的写法:*p_xx 指针变量通常以*p_ 开头,是英文指针Pointer 的首字母
2.& 取址
&a 变量a的内存地址
int main()
{
int a = 12312312;
int *p1;
p1 = &a;
printf("*p1:%d,p1指向的内存地址%X",*p1,p1);
return 0;
}
二、指针修饰符
1.const 常量指针
const char *p; 从右往左理解: *p 指针 char 指向1个字节的内容 const 该字节内容为只读 场景:描述字符串char *const p; 从右往左理解:*p 指针 const 指针方向为只读(无法切换) char 指向的内容是1字节,内容允许修改 场景:硬件资源 3.const char *const p; 结合了上面1和2的限制,指针方向为只读,指向的内容为只读 场景:ROM设备
const char *p;
char const *p;
char *const p;
char *p const;
2.volatile 特征指针
volatile char *p; 防止优化指向内存地址(阻止指令重排)
3.typedef 别名指针
为指针起别名,复杂的指针场景使用,提高代码可读性 typedef char *xx_p
三、指针运算
1. ++ -- + -
指针的运算都是指向地址的运算,最小单位为当前指针变量的数据类型所占的内存大小 如:p+1 的效果为0x20+1*(sizeof(p))
2.[] 标签访问
指针指向的内存位置,标签默认为0,及:p[0] 标签访问一般用于非线性访问,如:访问当前指针指向内存位置的后边第二个位置p[2] 效果为*(p+2) 使用标签访问,则取出的是标签内存里的值,而不是地址 C语言的标签化默认是允许越界的,甚至用标签扫描整个内存,修改不同应用的属性
int main()
{
int a = 0x123;
int a1 = 0x134;
int a2 = 0x145;
int *p;
p = &a1;
printf("*p:%X ,*(p-1):%X ,p[-1]:%X,p[1]:%X \n",*p,*(p-1),p[-1],p[1]);
return 0;
}
四、指针逻辑操作
>= == <= != 指针可以做逻辑操作,比较大小,但实际运用的比较少 p1 > p2 指针所占的地址比较,意义不大 p1 == n 一般跟一个特殊值比较,比如p1 == 0x0 ,地址的无效值,结束标识,表示p1 处理完了 *p1 > *p2 实际上是指向变量值的比较
注意: 指针必须是同类型比较才有意义
总结
本章主要为C语言指针
Segmentation fault 段错误异常,通常是指针指向问题引起
|