指针
最常见得用途是 用来引用数据集合;
结构指针是一个数据结构的重要组成部分。
考虑把内存中一些元素组合起来形成链表
typedef struct ListElmt_{
void *data;
struct ListElmt_ *next;//结构不允许包含自身的实例,但允许包含指向自身实例的指针;
}listelemt;
数组
当一个数组标记符在表达式中出现时,C语言显然会把数组转化为一个指向数组第一个元素的固定指针;
数组引用 | 指针引用 |
---|---|
int f(){ | |
int a[10], *p; | |
p=a; | |
p[0]=5; | *p=5; |
return 0; |
二维数组
如果要访问一个二维数组如
a[i][j];
从指针的定义出发 这是一个指针嵌套;
a[0][0]; //指针为 **a;
a[i][j]; //内层指针为行,外层指针为列 所以访问指针为 *(*(a+j)+j)
通过指针实现传参
void swap(int *n1,int *n2){
int temp;
temp=*n1;
*n1=*n2;
*n2=temp;
}
C语言中函数的执行方式
一个可执行程序由四个区域构成:
代码区 | 运行时所执行的机器指令 | |
---|---|---|
静态数据区 | 全局变量和静态局部变量 | |
堆 | 运行时动态分布的存储空间 | |
栈 | 保存调用的相关信息,每一次调用都被当做是活跃的 | 输入参数;返回值空间;保存的状态信息;临时存储空间;输出参数。 |
栈是用来存储函数调用信息的绝好方案,这是由于栈后进先出的特点精确地满足了函数调用和返回顺序。其缺点是占用了相当大的空间。
如果想更好的使用栈来了实现递归,可以采用尾递归的方式来节省空间。