什么是指针
首先解释变量在内存中是如何存放的。
在计算机中,每个变量都会存放在内存中分配的一个空间,而每种类型的变量所占的空间又是不一样的,例如int型的变量占用4字节,而long long型的变量占用8个字节。可以把一个字节理解为一个“房间”,这样一个int型的变量就需要占用4个连续的“房间”;同理long long型变量则需要8个连续的“房间”来存放。既然有房间,就肯定有“房间号”,对应计算机中,每个字节都会有一个地址(即房间号),即变量存放的位置,而计算机就是同过地址找到某个变量的。变量的地址一般指它占用的字节中第一个字节的地址,也就是说,一个int型变量的地址就是它占用4个字节当中第一个字节的地址。
根据上面的理解,一个地址“指向”一个变量,可以通过地址来找到变量。在c语言中用“指针”来表示内存地址(或称指针指向了内存地址),而如果这个内存地址恰好是某个变量的地址,那么又称“这个指针指向该变量”。初学者可以简单理解为指针就是变量的地址(不严谨)
在c语言中,对变量的访问方式有两种:直接访问和间接访问。
直接访问:变量分配的地址中直接存储目标数据;(即地址中存数据)
间接访问:变量分配的地址中存储的是存储目标数据的地址;(即地址中存地址)
1 | #include <stdio.h> |
指针变量
指针变量用来存放指针(或者可以理解为变量地址),这个关系就跟int型变量用来存int型常量相同。可以把地址当作常量,然后专门定义一种指针变量来存放它。指针变量的定义如下:
1 | int* p; |
注意
在定义指针变量时必须指定基类型,即指针变量类型必须和基类的变量类型相等。
数组变量是特殊的指针
- 数组变量本身表达地址,所以
int a[10]; int *p = a;
无需用&取地址 []
运算符可以对数组做,也可以对指针做:p[0] = a[0]- 数组是一个
const
常量指针,两个数组间不能被赋值
- 数组变量本身表达地址,所以
const类型的指针
1 | //无非表达两种含义:指针不可修改、通过指针不可修改 |
指针变量运算
指针变量可以进行加减法运算。对于一个int*型的指针变量p来说,p+1是指p所指的int型变量的下一个int型变量的地址。这个所谓的下一个是指跨越了一整个int型(即4个字节),因此如果是p+i,则说明是跨越到当前int型变量后的第i个int型变量。除此之外,指针变量支持自增和自减操作。
动态内存分配
1 | malloc();申请内存空间 |