指针及链表

1.指针6个基本点

  • 是什么 
    指针是一个变量
  • 做什么 
    指针是用来存放地址的
  • 大小 
    sizeof = 4 (64位下 sizeof = 8)
  • 指针类型 
    作用:决定用什么视角看该块内存
  • 偏移 
    按指针的类型偏移
  • *才有意义

2.指针的使用

(1)使用指针变量之前确保该指针变量指向一个合法可用的内存单元

(2)指针变量与零值比较的问题

#define NULL ((void*) 0)
if (NULL == p)
 
 
  • 1
  • 2

(3)指针只有以下几种算术运算

p ± n;      //将指针偏移n个数据单位(指针指向的类型)
++p/p++;
--p/p--;
p1-p2;      //两指针之间的数据个数,而不是指针的地址之差
 
 
  • 1
  • 2
  • 3
  • 4

3.二级指针-指向指针的指针

二级指针

4.多级指针-误区

char **p1;      //普通的二级指针
char (*p2)[5];  //指针,指向char[5]数组的指针
char *p3[5];    //数组,以char *为元素的指针数组
 
 
  • 1
  • 2
  • 3

5.用指针处理链表

(1)链表

链表
①链表有一个头指针变量,head,它存放指向下一个元素的地址 
②链表中每一个元素称为结点,结点包含两个部分:

  • 用户所需数据
  • 下一个结点地址

③最后一个元素,即表尾,它的地址部分放一个NULL

(2)链表的定义

struct Student
{
    char name[10];
    int num;
    float score;
    struct Student *next;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(3)建立动态链表

struct Student *head;
struct Student *p;
p = (struct Student *)malloc(sizeof(struct Student));
head = (struct Student *)malloc(sizeof(struct Student));
if (NULL == head)
{
    printf("Memory create error!\n");
    return 1;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

6.指针在函数中出现的位置

(1)出现在返回值处

如:char *strcpy(char *,const char *);

(2)出现在函数名的位置

如:char *(*pstrcpy)(char *,const char *) 
定义了一个函数指针

(3)出现在形参表中

如:void fun(int *p) 
当数组作形参时,等价于用指针作形参

7.函数指针

(1)函数的定义

返回值类型 函数名(参数表)
{
    函数体
}
 
 
  • 1
  • 2
  • 3
  • 4

说明: 
编译后,函数就是一段段的机器码,函数名就是这段机器码的首地址(函数入口地址),是个地址常量. 
函数名是地址,地址又可以给指针复制,所以可以让指针指向函数. 
函数的类型,由形参返回类型共同决定.

(2)函数指针的使用

通过函数指针来调用所指向的函数,函数指针可以指向所有具有相同函数类型的函数.

①给函数指针赋值

pf = 函数名;

②使用函数指针来调用函数

(*pf)(实参列表)

③其它对于函数指针的操作都是没有意义

pf++;
pf1-pf2;
 
 
  • 1
  • 2

8.野指针

(1)定义

野指针是未指向合法内存的指针

(2)产生原因

①指针变量没有被初始化.指针变量刚被创建时不会自动成为NULL指针,此时它的值是垃圾值 
②指针被free之后,没有置位NULL 
③使用NULL指针(代码区,不可写) 
④指针操作超越了变量的作用范围(数组越界)

(3)如何避免野指针产生

①使用指针前一定要保证它指向了有效的合法空间 
②用malloc申请内存后,应立即检查指针是否为NULL 
③用free释放内存后,立即将指针置为NULL 
④避免数组或指针的下标越界


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值