C语言中指针的本质就是内存地址,存储内存地址的变量称为指针变量;指针变量提供通过地址间接访问和操作数据的能力。
指定变量的定义
数据类型 * 指针变量 = 初始值;
指针定义的三步骤:
- 变量名与*结合代表这是一个指针变量;
- 要保存谁(那个变量)的地址,将他的定义形式直接放在这里;
- 用*变量名替代定义的变量。
// 顶一个一个变量num
int num = 10;
// 要保存num变量的地址,将他的定义形式直接放在这里;然后通*指针变量替换变量名
int *pNum = #
- 这里pNum与*结合代表这是一个指针变量;
- pNum是变量,变量的数据类型是将变量名去掉剩下的就是变量的类型(这里是int *类型);
- 指针变量pNum存储什么数据类型的数据地址?将指针变量和指针变量最近的*一起去掉,剩余的就是保存什么数据类型的地址,这里是int表示存储的是int类型的内存地址;
int **p;
再拿一个二级指针来说明一下:(1)p与*结合表示这是一个指针变量;(2)p是变量,变量的诗句类型时int*;(3)将p和与p最近的*一起去掉剩余int代表存储的是一个int类型的地址;
指针类型的意义,为什么需要知道指针数据类型
声明指针的时候必须指定数据类型(如int *、long *),指针的数据类型决定了通过指针访问内存的粒度,比如int*访问4字节的内存,同时也决定了指针运算的步长。指针运算时(自增++、自减--)其指向内存地址偏移的字节数。 本质:步长就是指针所指向数据类型的字节数; 作用:
- 确保指针每次移动后,都能精确的指向“下一个同类型的数据”的起始地址;
- 指针在解引用时取多少字节的数据。
#include <stdio.h>
int main()
{
int num = 10;
int* pNum = #
printf("对pNum解引用时,取4字节的数据: %d\n", *pNum);
int arr[] = { 0, 1, 2, 3 };
int* pArr = arr;
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("通过数组指针+步长方式逐个访问数据元素: %d\n", *pArr);
pArr++;
}
return 0;
}
指针变量的大小
指针变量本身占用的内存大小取决于系统架构,在32位系统中通常为4字节,在64位系统中通常为8字节,与其指向的数据类型无关。