AutoLeaders控制组——指针学习笔记

控制组许瀚霖 2023-11-05 18:35:59

AutoLeaders控制组——指针学习笔记

1.定义指针

  指针是用于保存地址的变量。

  其输入方式为:

这表示为,定义了一个指针变量p且它的值为变量i的地址。

其中*是指让变量p定义为指针变量。

对于输入的特点:

  (1)*既可紧贴int又可远离int定义。

  (2)无论何种,当同时如图定义变量时,只有p为指针变量而q不是。

  (3)指针不止有int类型。

2.指针与函数

  1.*是单目运算符,用来访问指针的值所表示的地址上的变量,可以做右值也可以做左值。

如 :可用此方法访问原来的变量i并改变它的值。

同时,此方法可在函数调用中改变值,注意,此时仍满足函数的调用只是传入值而不改变,其原理为传入的值是i的地址,而改变的是i的地址,此时对*p的编辑即为对i的编辑。

  2.函数返回多个值,某些值就只能通过指针返回,传入的参数实际上是需要保存带回的结果的变量。

3.指针的应用场景:函数返回运算的状态,结果通过指针返回,常见的套路是让番薯返回特殊的不属于有效范围内的值来表示出错,但是当任何数值都是有效的可能结果是,就得分开返回了。

当除数是0,则返回0表示运算无法进行,如果不是0,则此时的指针即为返回该除法运算的结果。

3.指针与函数

  1.函数参数表中的数组实际上是指针,sizeof(a)==sizeof(int*),但是可以用数组的运算符[]进行运算。

  2.以下四种函数原型是等价的:

    int sum(int *ar,int n);

    int sum(int*,int);

    int sum(int ar[],int n);

    int sum(int [],int);

  3.数组变量本身表达地址,所以int a[10];int*p=a; // 无需用&取地址

    但是数组的单元表达的是变量,需要用&取地址a==&a[0]

    []运算符可以对数组做,也可以对指针做: p[0]<==>a[0]

     *运算符可以对指针做,也可以对数组做:*a=25

    数组变量是const的指针,所以不能被赋值

4.指针与const(仅C99)

  1.表示一旦得到了某个变量的地址,不能再指向其他变量

    int *const q=&i;//q是const

    *q=26;//OK

    q++;//ERROR

  2.表示不能通过这个指针去修改那个变量(并不能是的那个变量成为const)

    const int *p=&i;

    *p=26;//ERROR (*p)是const

    i=26;//OK

    p=&j;//OK

5.指针运算

  1.给指针+1不是给指针的值+1,而是加一个sizeof(),其中()内为指针类型,给一个指针加1表示要让指针指向下一个变量

    int a[10];

    int *p=a;

    *(p+1)->a[1]

    如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义。

  2.两指针相减的值不是两地址的差值,而要再除以它们的类型大小,即sizeof(),表示为两指针内能放几个该类型数据。

  3.*p++

    取出p所指的那个数据来,完事之后顺便把p移到下一个位置去,*的优先级虽然高,但是没有++高,常用于数组类的连续空间操作,在某些CPU上,这可以直接被翻译成一条汇编指令。

  4.0地址:内存中有0地址,但是0地址通常是个不能随便碰的地址,所以你的指针不应该具有0值,因此可以用0地址来表示特殊的事情:返回的指针是无效的,指针没有被真正的初始化(先初始化为0),NULL是一个预定定义的符号,表示0地址,有的编译器不愿意你用0来表示0地址。

  5.无论指向什么类型,所有的指针的大小都是一样的,因为都是地址,但是指向不同类型的指针是不能直接互相赋值的,这是为了避免用错指针

  6.指针的类型转换:void*表示不知道指向什么东西的指针,计算时与char*相同但不相通,指针也可转换类型:int*p=&i;void*q=(void*)p;这并没有改变p所致的变量的类型,而是让后人用不同的眼光通过p看它所指的变量,不再认为它时int,而是void

6.用指针来做什么

  需要传入较大的数据时用作参数,传入数组后对数组做操作,函数返回不止一个结果,需要用函数来修改不止一个变量,永泰申请的内存。

...全文
16 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

325

社区成员

发帖
与我相关
我的任务
社区描述
一个供Leaders学习交流的地方
c++javapython 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 叫我胡萝北
  • CheungZzzc
  • szu_gexu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧