C语言指针知识点小结

前期回顾

  C语言指针基础知识点(一)–指针及指针变量
  C语言指针基础知识点(二)–指针变量的引用
  C语言指针基础知识点(三)–指针变量作为函数参数
  C语言指针基础知识点(四)–通过指针引用数组
  C语言指针基础知识点(五)–用数组名作函数参数
  C语言指针基础知识点(六)–通过指针引用多维数组
  C语言指针基础知识点(七)–通过指针引用字符串
  C语言指针基础知识点(八)–返回指针值的函数
  C语言指针基础知识点(九)–指针数组和多重指针
  C语言指针基础知识点(十)–动态内存分配与指向它的指针变量

指针小结

1. 指针的含义

  指针就是地址,凡是出现"指针"的地方,都可以用"地址"代替,例如,变量的指针就是变量的地址,指针变量就是地址变量。

  要区分指针和指针变量。指针就是地址本身,例如2008是某一变量的地址,2008就是变量的指针。而指针变量是用来存放地址的变量。指针变量的值是一个地址

2. 什么叫"指向"

  地址就意味着指向,因为通过地址能找到具有该地址的对象。对于指针变量来说,把谁的地址存放在指针变量中,就说此指针变量指向谁。但应注意:并不是任何类型数据的地址都可以存放在同一个指针变量中的,只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。例如:

int a, *p;  // p是 int * 型的指针变量,基类型是 int 型 
float b;
p=&a;   // a 是 int 型,合法
p=&b;  // b 是 float 型,类型不匹配

  既然许多数据对象(如变量、数组、字符串、函数等)都在内存中被分配存储空间,就有了地址,也就有了指针。可以定义一些指针变量,存放这些数据对象的地址,即指向这些对象。

  void * 指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。显示或隐示的类型转换。

3. 在对数组的操作中正确地使用指针

一维数组名代表数组首元素的地址,如:

int *p, a[10];
p=a;

  p是指向 int 型类型的指针变量,显然,p 只能指向 a 数组中的元素,而不是指向整个数组。在进行赋值时一定要先确定赋值号两侧的类型是否相同,是否允许赋值。

p = a;, 准确地说应该是:p 指向 a 数组的首元素,在不引起误解的情况下,有时也简称为:p指向a 数组。 同理,p 指向字符串,应理解为 p 指向字符串中的首字符

4. 指针变量的归纳比较

变量定义类型表示含义
int *p[4]int *[4]定义指针数组p,它由4个指向整型数据的指针元素组成
int (*p)[4]int (*)[4]p为指向包含4个元素的一维数组的指针变量
int *p()int *()p为返回一个指针的函数,该指针指向整型数据
int (*p)()int (*)()p为指向函数的指针,该函数返回一个整型值
int **pint **p是一个指针变量,它指向一个指向整型数据的指针变量
void *pvoid *p是一个指针变量,其基类型为 void,不指向具体的对象

5. 指针运算

a. 指针变量加减一个整数

  例如: p++, p- -, p+i, p-i, p+=i, p-=i 等均是指针变量加(减)一个整数。
  将该指针变量的原值和它指向的变量所占用的存储单元的字节数相加(减)

b. 指针变量赋值

将一个变量地址赋给一个指针变量。如:

p=&a;         //  将变量a的地址赋值给p
p=array;      //  将数组array首元素的地址赋给p
p=&array[i];  // 将数组 array 第 i 个元素的地址赋给p
p=max();      // max为已定义的函数,将max的入口地址赋给p
pa=p2;        // p1和p2是基类型相同的指针变量,将p2的值赋给p1

c. 两个指针变量可以相减

  如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数。

d. 两个指针变量比较

若两个指针变量指向同一个数组中的元素,则可以进行比较。指向前面的元素的指针变量"小于"指向后面元素的指针变量。如果 p1 和 p2 不指向同一数组则比较无意义。

6. 指针变量可以有空值

指针变量可以不指向任何变量,可以这样表示:

p=NULL;

其中,NULL是一个符号常量,代表整数0。在stdio.h头文件中对NULL进行了定义:

# define NULL 0

它使p指向地址为0的单元。系统保证使该单元不作他用。

注意:

  1. 不应把一个整数赋给指针变量
  2. p的值为 NULL 与未对 p 赋值是两个不同的概念。
  3. 任何指针变量或地址都可以与NULL作相等或不相等的比较,例如: if (p==NULL)
  • 37
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值