指针使用的三个注意

指针

指针是一个用存储地址的变量;
它可以存储某一变量的地址值,例如存储一个整型变量的地址:

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指向哪,指向对象的内容是什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值