指针笔记(fjl)

一、指针的概念

  1. 什么是指针:指针是一种储存变量地址的特殊变量,形如&i,int*p(一级指针格式:指针类型*指针名=地址)
  2. &运算符:取变量地址。*运算符:通过地址取变量值。两者为互逆运算。
  3. *p(int*p=&i)指代i,可以读取或者改写i的值
  4. 指针是有类型的,类型与所指对象有关:如int*p指的是p是一个int型的指针
  5. 指针的void的类型:在未知所指变量类型时使用,仅保存变量的首地址,不保存目标的空间大小,不能进行取值和加减运算,但任意类型的指针都可以赋值给它
  6. 指针的强制类型转换:如int*p强制类型转换成void型:(void*)p;
  7. printf输出&i或p:用%p指代
  8. 一级指针概念:像上面,指向普通变量的指针即一级指针
  9. 多级指针概念:指向指针的指针。二级指针格式:int**p。格式断句:int*的*。二级指针的取值逻辑如下:可见对二级指针变量,存储了一级指针的地址,第一次取值由一级指针地址取得一级指针所存地址即a的地址,第二次取值则由a的地址取得a的值。更高级指针以此类推

二、地址

  1. 指针变量本身的字节数取决于计算机是32位(4)还是64位(8)
  2. 先定义的变量地址在更高的地方,定义的变量按顺序紧挨
  3. 如果编译器中int与指针变量的占有的字节相同,则少了&不会报错
  4. 0地址与NULL:一个应用是用于指针的初始化,易于free

三、指针与数组

  1. 指针加减运算(同类型有意义):即推后到该类型的下一地址 ,比较运算,赋值运算(同类型有意义),*p++(因为++优先级高,意思为读取原来p并且访问,但语句结束时p+=1)
  2. 指针赋值运算:指针类型*指针名=变量地址(一级指针)
  3. 解读*p++:因为++运算级高于*,所以先做++后指向了原来的地址
  4. 指针与一维数组:1、函数原型中参数表内数组的格式如:int a[ ],int[ ],int *a。使用时用int[ ]即可。2、首地址:对于数组int a[4],若有int*p=a,意思是取a的首地址,即a[0]。若要取之后的单元可以使用:int*pb=a+1;或者int*pb=&a[1];。3、需要注意的sizeof:当a为首地址时,显然sizeof(a)不再是指a这个一维数组的字节数了。4、数组地址固定不可改,所以无法数组之间无法直接赋值
  5. 指针与多维数组(二维数组为例),对于int a[ ][ ],表达式及其含义如下(根本还是理解首地址的与指针的加减运算):
  6. 指针与字符串(首地址):char*string=“i love china”,因为字符串相当于一个字符数组,所以string实际上指向了这个字符数组的初始位置,printf("%s",string);可以打印完这个字符串。指针指向字符串与指向数组类似。
  7. 指针数组:当一个数组的单元为一级指针时,可以用二级指针进行遍历:

四、指针与函数

  1. 函数中的指针的格式(函数参数表格式:变量类型*变量名。实参:p或&i)
  2. 利用指针可以用*p改写并返回多个值
  3. 指针函数:以返回一级指针为例,形如:int*f(int x,int y)。int*为返回类型
  4. 函数指针:指向一个函数。形如:int(*f)(int a, int b)。f是一个指针,指向一个int返回类型的函数,参数表为(int a, int b),赋值时f=函数名

五、指针与const:int i;

  1. const int*p=&i与int const*p=&i:表明*p是const,不可以通过*p修改i的值,但i是否是const要看i自身定义
  2. int*const p=&i:表明指针是const,不可改指

六、动态内存申请与返还:

        格式:int n;int*a=(int*)malloc(n*sizeof(int));就完成了a这个int型指针指向了一块内存空间。此时a相当于一个int类型的数组,n为数组的容量。注意:申请动态内存要加stdlib头文件,并且拿了空间以后,还要free(),free时确保p为原址。

七、指针的应用

a.函数返回多个值或者修改多个值,b.在结构,数组整体有很多int,但如果是用指针来引入,在函数里,它只占4(传入较大数据做参数),c.动态申请内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值