8.1指针是什么?
- 直接访问
- 间接访问
- 指针(地址)
- 指针变量P222
- 注意 指针在没有指向特定位置前,可以赋值为 NULL。省的造成系统崩溃。
C语言没有引用啊,C++才有. 引用能起到指针的部分作用,但是比指针安全. 一个引用可以看作是某个变量的一个”别名”
8.2指针变量
- 指针运算符,表示是*指向
- &取地址运算符
- 指针变量作为函数参数
- 注意p228,函数实参与形参之间的参数传递”是单向传递“的。只能由实参传给形参。
- 不可能调用函数,来改变实参指针变量的值;但是可以在所调用的函数中实现对实参指针变量所指变量的值
8.3通过指针引用数组
- int *p=a
- int *p=&a[0]
- []是变址运算符p232,a[i] *(a+i)
- p234 使用p++ 直接进行地址的控制,来进行输出,可使程序简洁高效。
- _p++ , _p(++) (结合性自左向右)
- 用数组名做函数参数。4种对应关系 p241
- **arr[i]和(arr+i)无条件等价 p238
- 多维数组的地址
- a[i][j]和((a+i)+j) *(a[i]+j)这三个完全等效
- 在指向行的指针前面加一个*,就成为指向列的指针。
- 在指向列的指针前面加一个&,就成为指向行的指针。
8.4通过指针引用字符串
- %s输出字符串格式符 %c
- C语言中只有字符变量 没有字符串变量,字符串是放在字符型数组里面的
- 字符串输入输出,都是可以直接用scanf printf()变量名实现的,而不用像其他数组一样,要加上for循环。也不用加&地址符。p160
- 下标法 移动指针变量法(地址法)p261
- 数组可以在定义时对各元素赋初值,但是不能用赋值语句对字符数组中全体元素整体赋值。p264
- char *a定义后一定要及时对他初始化地址,指定其指向,要不然会有严重后果。p264
- 可变格式输出函数 p266
8.5指向函数的指针
- 函数指针p266
- int (*p)(int,int); p=max;
- 用指向函数的指针做函数参数。p271编写通用函数 结构化程序设计方法
8.6返回指针值的函数
- int *a(int x,int y) { ……}
8.7指针数组和多重数组
- int p[] 指针数组,这个数组是int型的。
- int (*p)[] 指向某一一维数组的指针
- 指向指针数据的指针变量 char **p p280
- 间接访问、二级间址
8.8 动态内存分配与指向他的指针变量p285
include
- 全局变量存在静态存储区,非静态的局部变量是分配在内存的动态存储区的。称之为栈
- 栈 动态存储区
- 堆 特别的自由存储区 可随时开辟 随时释放。由于未在声明部分定义其为变量或者数组,只能通过指针来引用这些数据
- 库函数malloc calloc realloc 其基类型都是void,无类型指针,仅提供一个地址,不指向任何具体的对象。
- malloc(SIZE)
- calloc(n,size) 为一维数组分配空间
- free(*p)
- realloc(*p,size)
- void指针类型 指向空类型 仅得到一个空地址,不能指向任何对象、变量。
8.9 小结