说明:
在学习UI高级知识之前,将利用最近十来天的时间回顾一下C语言,主要按照《C程序设计(谭浩强版)》来回顾。
整理一些知识点(不是细节,知识个人觉得较重要或易忘的)以及挑一些课后题目或经典习题编写代码练习。
第8章 善于利用指针
1、多重指针:指向指针的指针
较简单,主要还是对指针,地址,内容三者关系的理解,理解透彻了,指针的内容都很简单。
2、指针数组作main函数的形参
下列是Xcode最开始的main函数,当然形参也是可以去掉或者写void的。
int main(int argc, const char * argv[])
argc:argument count缩写,参数个数
argv:argument vector缩写,参数向量,是一个char*的指针数组,数组中的每一个元素(其值为指针)指向命令行中得一个字符串。
3、动态内存分配
栈区(stack):非静态的局部变量(包括形参)分配在内存中的动态存储区(全局变量在静态存储区);
堆区(heap):存放临时用的数据(不需要在程序的声明部分定义,也不用等到函数结束才释放,随时开辟,随时释放)的内存动态分配存储区。
动态内存分配函数:
函数 | 原型 | 功能 |
---|---|---|
malloc | void *malloc(size_t); | 在堆区申请长度为size的连续空间,返回值是所分配区域的第一个字节的地址,基类型void即不指向任何类型的数据,只提供一个地址 |
calloc | void *calloc(unsigned n, size_t); | 在堆区申请长度为n个长度为size的连续空间,空间一般比较大,足够保存一个数组 |
free | void free(void *p); | 释放指针变量p所指向的已分配的动态空间 |
realloc | void *realloc(void *p, size_t); | 已通过malloc或calloc获得动态空间,利用realloc改变其大小,重新分配,p值不变 |
上述的函数声明都包含在stdlib.h头文件中
4、void指针类型:“指向空类型”或“不确定指向的类型”
int a = 3;
void *p;
p = &a;
p = &a 由于p是空类型,赋值后p得到a的纯地址,并不指向a,所以不能通过*p输出a的值。
使用注意:把void类型赋值给不同基类型的指针变量(或相反)时,编译系统会自动进行转换,不必进行强制转换。当然转也没错。
5、指针变量可以为空值:不指向任何变量p = NULL;
其中NULL是一个符号常量,代表整数0.
在stdio.h头文件中对NULL的定义是#define NULL 0
,使得p指向地址为0的单元
注意:赋NULL跟不赋值是不一样的,前者有值为0,不指向任何变量;后者并非意味着p无值,而是一个无法预料的值,可能指向一个实现未指定的单元,很危险!所以一般要赋值!
6、const与指针变量
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a;
const int *p1; //语法上是不能改变*p1的值,但是能改变p1的值,就是能改地址不能改地址所指内容
int const *p2; //能改地址,不能改内容
int *const p3; //能改内容,不能改地址
p1=&a;
*p1=1;
return 0;
}
运行时有错误的!
p1=&a;
*p1=1;
这两行其中一行会出错,通过修改p1,p2,p3运行即可知道其含义,地址或所指内容可不可改。