指针1

128 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

# include <stdio.h>
    int main(void)
    {
        int * p;
        int i = 3; 
        
        p = &i;//取地址
        return 0;
    }

p是变量的名字,int * 表示变量p存放的是int类型变量的地址。如果p=&i写成p=i是错的,原因:p只能存放int类型变量的地址,不能存放int类型变量的值。

p保存了i的地址,因此p指向i
p不是ii也不是p,修改p的值不影响i的值,修改i的值也不影响p的值。
如果一个指针变量指向了某个普通变量,则* 指针变量就等价于普通变量。(意思就是说在所有出现*p的地方都可以替换成i,或者所有出现i的地方都可以替换成*p)
*p就是以p的内容为地址的变量。

指针就是地址,地址就是内存单元的编号。 指针变量是存放地址的变量 指针和指针变量是两个不同的概念

指针作用:

   表示一些复杂的数据结构
   快速的传递数据
   使函数返回一个以上的值
   能直接访问硬件
   能够方便的处理字符串
   是理解面向对象语言中引用的基础。
   

指针的定义

 地址: 
      内存单元的编号
      从零开始的非负整数
      范围:0-4G-1;
 指针:
      指针的本质就是一个操作受限的非负整数

指针的分类

  1、基本类型指针
      不管是几级指针,宽度都为4个字节
      任何数据类型前加*都表示该数据类型的一个指针。
  2、指针和数组
  3、指针和函数
  4、指针和结构体
  5、多级指针

指针常见错误

image.png

*qp的类型不一样,一个是指针变量,一个是指针变量的值。所以错

image.png

q指针未指向一个明确的地址

image.png

q是垃圾值,q赋值给pp也变成垃圾值。
q的空间属于本程序,所以程序可以读写q的内容,
但是如果q内部是垃圾值,则本程序不能读写*q的内容
因为此时*q所代表的内存单元的控制权限并没有分配给本程序。

还有就是关于 * 和 & 的一些用法:

*可以用来表示乘法
在指针中的*  可以表示一个指针变量;还可以表示获取指针指向的数据,这是一种间接的操作,在其定义好之后就可以这么表示。
&表示取地址,&后面可以跟变量(不能跟常数)