浅谈C指针

7 阅读2分钟

C语言中指针的本质就是内存地址,存储内存地址的变量称为指针变量;指针变量提供通过地址间接访问和操作数据的能力。

指定变量的定义

数据类型 * 指针变量 = 初始值;

指针定义的三步骤:

  1. 变量名与*结合代表这是一个指针变量;
  2. 要保存谁(那个变量)的地址,将他的定义形式直接放在这里;
  3. 用*变量名替代定义的变量。
// 顶一个一个变量num
int num = 10;

// 要保存num变量的地址,将他的定义形式直接放在这里;然后通*指针变量替换变量名
int *pNum = #
  1. 这里pNum与*结合代表这是一个指针变量;
  2. pNum是变量,变量的数据类型是将变量名去掉剩下的就是变量的类型(这里是int *类型);
  3. 指针变量pNum存储什么数据类型的数据地址?将指针变量和指针变量最近的*一起去掉,剩余的就是保存什么数据类型的地址,这里是int表示存储的是int类型的内存地址;
int **p;

再拿一个二级指针来说明一下:(1)p与*结合表示这是一个指针变量;(2)p是变量,变量的诗句类型时int*;(3)将p和与p最近的*一起去掉剩余int代表存储的是一个int类型的地址;

指针类型的意义,为什么需要知道指针数据类型

声明指针的时候必须指定数据类型(如int *、long *),指针的数据类型决定了通过指针访问内存的粒度,比如int*访问4字节的内存,同时也决定了指针运算的步长。指针运算时(自增++、自减--)其指向内存地址偏移的字节数。 本质:步长就是指针所指向数据类型的字节数; 作用:

  1. 确保指针每次移动后,都能精确的指向“下一个同类型的数据”的起始地址;
  2. 指针在解引用时取多少字节的数据。
#include <stdio.h>

int main()
{	
	int num = 10;
	int* pNum = &num;

	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字节‌,与其指向的数据类型无关。