c语言学习---指针

一.指针的本质

  • 指针的使用场景----传递和偏移

1.定义

  • 左边是虚拟地址,都是???,没有给你用
    在这里插入图片描述

  • 把妹纸的地址存下来,就需要指针变量在这里插入图片描述

  • CPU只能访问到字节,不能访问到位
    在这里插入图片描述

  • int* p;

  • int *p,a; //p是指针变量,a是int型

  • 指针变量是一种特殊的变量,只能存放地址
    在这里插入图片描述
    在这里插入图片描述

  • 指针的本质就是为了实现间接访问.

  • 取地址操作符&又称引用,获取一个变量的地址值

  • 取值操作符*又称解引用,得到一个地址对应的数据

  • 地址就是指针

二.指针的使用场景—传递和偏移

1.传递

  • 函数的调用是值传递
    在这里插入图片描述

2.偏移

  • 对指针的加减,+就是向后偏移,指向下一个元素;同理-.
  • 指针变量加1后,偏移的长度是其基类型的长度,就是偏移sizeof(int),这样通过*(p+1),就可以得到a[1]
    在这里插入图片描述
  • 数组名里存的就是指针
  • *(p+2)=p[2]

3. 指针与自增自减运算符

  • 在这里的a不能换成arr.因为数组定义时相当于arr已经和地址绑定了在这里插入图片描述
    在这里插入图片描述
  • (),[]的优先级比后++高

4. 指针与一维数组

  • 一维数组名中存储的就是数组的首地址

在这里插入图片描述

5.指针与动态内存申请

在这里插入图片描述

在这里插入图片描述

  • size_t:字节

6. 字符指针和字符数组

  1. 字符串常量是放在数据区的常量区的,好处是相同的字符串只用存储一次,常量区的字符串不能修改
  2. 字符数组c在栈空间有10字节大小的空间
    在这里插入图片描述
  • p是一个指针变量,我们可以重新将一个地址赋给它
  • 但数组名c本身存储的就是数组的首地址,相当于符号常量,因此不能给c重新赋地址
    在这里插入图片描述
  1. 函数执行结束,栈空间会被释放,堆空间不会,堆空间要自己释放
  • 返回值要和类型一致才行
    在这里插入图片描述
  1. 野指针
  • 分手过后,要彻底忘记NULL
    在这里插入图片描述

7. const

  • const char *ptr
  • const放在前面,代表不能用ptr区修改它指向的空间的内容去在这里插入图片描述
  • char * const ptr
    不能修改const指针,但可修改该指针的内容

8.memcpy函数与memmove函数的差异

在这里插入图片描述

三.数组指针和二维数组

在这里插入图片描述

  • 数组指针还是指针,占4个字节(类别:整型指针,字符指针)
  • 指针数组存放了四个指针元素,占16字节(类比一下:整型数组,字符型数组,指针数组)
  • 任何数组名都是存了一个地址
    在这里插入图片描述
  • b[4],b是整型指针,&b是数组指针在这里插入图片描述
  • 二维数组数组名中存放的是数组指针,&b+1,偏移了一个数组长度
    在这里插入图片描述
    在这里插入图片描述
  • 对整型指针取值得到整型1,2,3…
  • 对数组指针取值得到数组a[1],a[2]…
  • 一维数组a[1]是数组名,本身也是指针,可再次进行偏移
    在这里插入图片描述
  • 任何变量取地址+1,指向其所占空间的末尾

四.二级指针

  1. 二级指针指服务于一级指针
    在这里插入图片描述
    在这里插入图片描述
  2. 二级指针的偏移
  • 服务于指针数组
  • int a[5],整型数组,每个整型元素占4个字节
  • int *p[5],指针数组,每个指针元素占sizeof(int *)*5=20个字节
  • 场景:商品排序
  • 指针数组是数组,只是其中存了5个指针
  • 一维数组的数组名就是一级指针
  • 让每个指针指向字符串常量区的每个字符串
  • 放在下面是把 字符串常量区的每个字符串往栈空间copy
    在这里插入图片描述
    在这里插入图片描述

五.函数指针

  • 函数名里存的就是函数入口地址

猜你喜欢

转载自blog.csdn.net/weixin_43722052/article/details/114415641