第15天:有关指针的高级用法
指向指针的指针
int multi[3][4];
int (*ptr)[4];
int *p;
p = (int *)ptr;
上面multi是一个指针指向multi[0],multi[0]也是一个指针指向multi[0][0]。
ptr是一个能指向包含4个int变量的数组的指针变量,数组指针。必须用圆括号否则声明的是指针数组,因为间接运算符的优先级低于[]。
(int *)是强制类型转换,暂时将ptr的数据类型从声明的类型转换为新的类型。
指针数组
char *mes[20];
将指针数组传递给函数:
void pfs(char *p[], int n);
void pfs(char **p, int n);
上面两个均可以传递指针数组,实际上传递的是指向指针的指针。
int指针数组,int *p[4];
p[0]+1;
的内容并不是p[1]
而是p[0]
所表示的地址加上4个字节。
malloc()默认返回void类型的指针。前面加(char *)强制转换。
函数指针
type (*ptr_to_func)(paremeter_list);
*ptr_to_func加括号是因为 *的优先级小于()。如果不加则定义的是返回指针的函数。
被指向函数的返回类型和参数列表必须和指针声明的返回值和参数列表相同。
int square(int);
int (*ptr)(int);
ptr = square;
不带括号的函数名是一个指向函数的指针常量。
- 声明函数指针一定用圆括号;
- 不要将函数指针指向返回类型和参数列表不匹配的函数。
链表
链表中的数据被存储在结构中。
struct person{
char name[20];
struct person *next;
};
组成链表的结构可称为链接、节点或元素。
最后一个节点的next指针为NULL,头指针(非结构)指向第一个节点。
- 节点加入开头
new = (struct person*)malloc(sizeof(struct person));
new->next = head;
head = new; //如果先赋值头指针,链表丢失
- 节点添加至末尾
struct person *current;
current = head;
while (current-> != NULL)
current = current->next;
new = (struct person)malloc(sizeof(struct person));
current->next = new;
new->next = NULL;
- 节点添加至中间
struct person *marker; // desired location
...
new = (...)malloc(...);
new->next = marker->next;
marker->next = new;
- 删除节点