指针
指针是一个用存储地址的变量;
它可以存储某一变量的地址值,例如存储一个整型变量的地址:
int a=5;
int *p=&a;
或者存储一段连续空间的地址,如结构体的某一单元:
Node *p=(Node *)malloc(sizeof(person));
又或者存贮函数的地址:
int (*compare)(int a.int b);
当然指针之间也可以赋值,例如:
int *p=&a;
int *q=p;
这说明指针p、q都指向了a这个变量;
指针存储了谁的地址,它就指向了谁。使用指针必须要注意:
1.指针指向的是谁,指向的必须是一块有意义的内存;
2.指针指向的对象的内容是什么(对象的内容是否改变);
3.一定不要使用未初始化的指针;
以下面这一小段约瑟夫环的实现代码为例:
typedef struct node{
int number;
struct node * next;
}person;
person * initLink(int n){
person * head=(person*)malloc(sizeof(person));
head->number=1;
head->next=NULL;
person * cyclic=head;
for (int i=2; i<=n; i++) {
person * body=(person*)malloc(sizeof(person));
body->number=i;
body->next=NULL;
cyclic->next=body;
cyclic=cyclic->next;
}
cyclic->next=head;//首尾相连
return head;
}
该函数是为了将约瑟夫环初始化,即将n个元素首尾连接在一起,person *head指向了一个number=1的结构单元(简称1吧),之后person *head将这段地址赋值给了person *cyclic,这时cyclic存储的是1的内存地址,然后操作cyclic->next=body使得cyclic控制1指向了2,然后cyclic=cyclic->next使得cyclic存储了2的地址,以此循环直到cyclic变成了存储n的地址,最后cyclic->next=head将head存储的地址赋值给了cyclic->next,因为head存储的始终是1的地址,所以1到n的就结构单元首尾相连啦
整个过程要始终清楚指针head与指针cyclic指向哪,指向对象的内容是什么