云计算百科
云计算领域专业知识百科平台

C 语言 指针

一、核心概念

  • 地址:内存中每个字节的唯一编号(类似门牌号),64 位系统占 8 字节,32 位系统占 4 字节,以十六进制表示(如0x7ffeefbff5c4)。
  • 指针:本质就是内存地址,是一个固定数值,用于指向对应内存空间。
  • 指针变量:专门存储地址的变量(类似记录门牌号的本子),可修改存储的地址,进而访问不同内存数据。
  • 二、关键操作符

  • &(取地址符):获取变量的内存首地址,语法&变量名,返回值为该变量地址,类型为 “指向该变量类型的指针”(例:int a=10; &a 得到a的地址,类型为int*)。
  • *(解引用符):通过地址访问内存数据,分两种场景:
    • 读操作(右值):*指针变量,获取指针指向地址的内存数据(例:int* p=&a; *p 得到a的值 10)。
    • 写操作(左值):*指针变量=数值,将数值写入指针指向的内存(例:*p=20 使a的值变为 20)。
  • 互逆关系:*&a == a、&*p == p。
  • 三、指针变量的定义与初始化

  • 定义语法:数据类型 *指针变量名;
    • 数据类型:指针指向的内存数据类型(如 int、char、double),决定指针运算偏移量和解引用访问内存大小。
    • 注意:多个指针变量定义时,每个变量前需加*(例:int* p1, *p2;,避免写成int* p1, p2;,后者p2为普通 int 变量)。
    • 常见示例:int* p;(指向 int)、char* str;(指向 char)、double* d_p;(指向 double)。
  • 初始化(杜绝野指针):
    • 指向已定义变量:int a=10; int* p=&a;(最常用,确保指向有效)。
    • 初始化为空指针:int* p=NULL;(NULL 本质是 0,指向0x0不可读写地址,使用前需判断p!=NULL)。
    • 指向连续内存:int arr[5]={1,2,3,4,5}; int* p=arr;(数组名arr是首元素地址)。
  • 四、指针的核心特性

  • 大小:与指向类型无关,仅由操作系统位数决定。64 位系统中所有指针变量均为 8 字节,32 位系统中均为 4 字节。
  • 运算规则(地址偏移):
    • 支持++、–、+、-运算,本质是地址偏移,偏移量 = 指向数据类型的大小。
    • 示例:int* p(int 占 4 字节),p++偏移 4 字节;char* str(char 占 1 字节),str++偏移 1 字节;double* d_p(double 占 8 字节),d_p++偏移 8 字节。
  • 五、核心实战场景

  • 函数传址调用:
    • 解决 “传值调用无法修改外部变量” 的问题,将变量地址传入函数,函数内部通过指针操作地址,直接修改外部变量。
    • 价值:突破函数作用域限制,避免依赖全局变量(易混乱)或单个返回值(局限性)。
  • 操作数组与字符串:
    • 数组名是 “指向首元素的指针常量”(不可修改指向),指针偏移遍历数组比下标访问更高效,可直接指向数组任意位置,灵活性更高。
    • 字符串是 “以\\0结尾的字符数组”,字符指针是主流操作方式,可灵活遍历、修改(针对可修改的字符数组)。
  • 动态内存管理:
    • 结合malloc、calloc等函数,程序运行时动态分配内存,函数返回分配内存的首地址,赋值给指针后操作,用完用free释放。
    • 价值:解决数组大小固定的问题,适合数据量不确定的场景(如变长字符串、动态扩容数据集),是链表、栈、队列等复杂数据结构的基础。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » C 语言 指针
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!