C语言基础学习记录-指针

1.指针的定义:

指针就是专门用来存放另一变量在内存中数据的地址

假如定义了指针p是一个变量a的地址,那么p就是a在计算机内存里面存放的地址

通过地址能找到所需的变量单元,可以说, 地址指向该变量单元,将 地址形象化地称为 ”指针“ 。
  • 变量:命名的内存空间,用于存放各种类型的数据
  • 变量名:变量名是给内存空间取一个容易记忆的名字。
  • 变量值:在变量单元中的存放的数据值
  • 变量的地址: 变量所使用的内存空间的地址,即指针。

1.1.指针和指针变量

  • 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。
    • 指针的实质就是内存“地址”
  • 指针变量就是存储这个地址的变量。

指针变量 :一个变量专门用来存放另一变量在内存中数据的地址(即指针),则它称为”指针变量“ 。我们可以通过访问指针变量达到访问内存中另一个变量数据的目的。(有时为了阐述方便 ,将指针变量 直接说成指针 ) 

 1.2、指针变量的定义

  • 指针也是一种数据类型其 类型 是 指针 指向的 内存空间 的 数据类型,指针变量也是一种变量,用来存储地址的变量
  • 指针变量指向谁,就把谁的地址赋值给指针变量
语法格式:
数据类型 * 指针变量名[=初始地址值 ]
  • 数据类型 是指变量所指向变量数据类型。可以是int 、char 、float等基本类型,也可以是数组等构造类型。 (变量)
  • 字符 * 用于告知系统这里定义的是一个指针变量,通常跟在类型关键字的后面。 (指针变量)
比如, char * 表示一个指向字符的指针, float * 表示一个指向float类型的值的指针。
此外,还有指向数组的指针、指向结构体的指针。

2、指针的运算

指针作为一种特殊的类型可以参与运算,但与其他数据类型不同的是,指针的运算都是针对内存中的地址来实现的。

普通变量定义:类型 变量;

指定变量定义:类型 *指针变量=&变量

- & 叫取地址,返回操作数的内存地址
-  * 叫解引用,指 操作指针所指向的变量的值
- 在定义变量时,* 号表示所声明的变量为指针类型
- 指针变量要保存某个变量的地址,指针变量的类型比这个变量的类型多一个  *
-  在指针使用时,* 号表示操作指针所指向的内存空间

 指针变量赋值

1.指针变量中只能存放地址 (指针),不要将一个整数(或任何其它非地址类型的数据)赋值给一个指针变量
2.C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,即它是 ”带类型的地址“。
          所以,一个指针变量只能指向同一个类型的变量,不能抛开类型随意赋值。

       如:   char *类型的指针是为了存放char类型变量的地址

  3.在没有对指针变量赋值时,指针变量的值是不确定的,可以系统会分配一个未知的地址,此时使用此指针变量可能会导致 不可预料的后果甚至是系统崩溃。为了避免这个问题,通常给指针变量赋初值为0(或NULL),并把值为0的指针变量称为  空指针变量。

重点理解:指针间接修改变量的值 (&)*****
  • 指针变量指向谁,就把谁的地址赋值给指针变量
  • 通过 *指针变量 间接修改变量的值

2.1指针的步长

指针步长指的是通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量。

●指针的步长取决于所指向的数据类型。

○指针加n等于指针地址加上 n 个 sizeof(type) 的长度

○指针减n等于指针地址减去 n 个 sizeof(type) 的长度

 

 3.野指针

1、指针未初始化

  • 指针变量在定义时不会自动初始化,如果未初始化,而是随机的一个值。此时操作指作 指针就是去访问一个不确定的地址,所以结果是不可知的。此时该指针成为野指针。
  • 解决方案:在定义指针时,要么将其初始化为一个合理的地址,要么初始化为NULL

2.指针越界访问 

3、指针指向空间的释放后未置为NULL

  • 在使用freedelete释放内存后,指针指向的内容被销毁,空间被释放,但指针的值并未改变,仍然指向这块内存。
  • 解决方案:在调用freedelete之后,应立即将该指针置为NULL,以避免成为野指针。

2.1 避免野指针的方法:

1. 指针初始化    int *p=NULL;

赋值为NULL值的指针称为 空指针,NULL指针是一个定义在标准库中的值为零常量

# defined NULL 0

2. 小心指针越界

3. 指针指向空间释放及时置NULL 

4. 避免返回局部变量的地址

5. 指针使用之前检查有效性

4.二级指针(多级指针)

一个指针p1记录一个变量的地址。由于指针p1也是变量,自然也有地址,那么p1变量的地址可以用另一个指针p2来记录。则p2就称为 二级指针
  • 语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。
  • 二级指针就是指向一个一级指针变量地址指针
  • 多级指针,通俗的讲就是指针的指针
格式 : 数据类型 **指针变量

 如下面举例说明:

int a=10;

int *pa = &a;// pa是一级指针

int **ppa = &pa; // ppa是二级指针 ,类型为 int **

---int * 表明 ppa指向的元素类型 第二个 * 等于是告诉编译器 ppa是一个指针变量

int ***pppa = &ppa; //p 这种情况一般不会遇到的

上面这段代码, pa 就叫一级指针,也就是平时常说的指针,

ppa 就是二级指针。

不管几级指针有 两个最核心的东西
  • 指针本身也是一个变量,需要内存去存储,指针也有自己的地址
  • 指针内存存储的是它所指向变量的地址

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值