指针的基本用法
- 是程序简洁、紧凑、高效
- 有效的表示复杂数据结构
- 动态分配内存
- 动态分配内存
- 得到多于一个的函数返回值
指针有什么缺点呢?
1. 地址和变量
- 在计算机内存中,每一个字节单元,都有一个编号
- 变量是对程序中数据存储空间的抽象
2.指针
- 指针为内存单元的地址,指针变量为存储地址的变量。(挖槽,对不对啊)
- C语言内存的分配从低向高分配(是否和大小端有关?)
- 指针变量的声明
- int a=3, *pa=&a;(int*)
- 向指针复制必须为地址常量或相同类型的指针变量
3.指针运算
算数运算
- 以目标数据的长度为单位进行运算
- 两个指针相减,为两指针空间差所能存放的目标数据个数
指针与一维数组
int a[],*p;
p=a;
a[i]==*(p+i)==p[i]==*(a+i);
区别:指针变量是地址变量,数组的名是地址常量
指针与二维数组
a[][],a代表的是首地址,a+1代表的是下一行的首地址,作用降维引用
字符指针与字符串
C语言没有字符串数据类型,通过字符数组处理字符串
- char str[]=”Hello”;char *p =str; 数组中的值可以修改
- char *p= “Hello”; 字符串为常量,常量的唯一性.
指针数组
指针数组指由若干个相同存储类型和数据类型的指针的集合,(一组地址)
多级指针
- 把一个指向指针的指针变量,称为多级指针变量
- 对于指向处理数据的指针变量称为一级指针变量,简称一级指针
而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针
- 多级指针的运算
指针变量加一,向地址大的方向移动一个目标数据,类似的道理,多级指针运算也是以其目标变量为单位进行偏移。目标变量的长度取决于变量类型在系统中的占有的内存位数。
指针数组名多级指针
void指针和const修饰符
- void指针是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量
- 对于void指针,在没有强制类型转换之前,不能进行任何指针的算数运算
void指针的应用
1. void* malloc(size_t size);动态内存申请
2. int pthread_create()线程
3. void qsort() 排序
总结,为了使函数接口更加的通用.
const修饰一个变量,此变量的值无法再修改,用指针指向const变量时,其指针也应为const
- const在*前,限制通过指针改变目标,但指针变量存储的地址可以修改
- *在const前,指针不可以在存储其他的地址,但是*q可以改变其指向的目标
- const *const q 啥都不能改