当前位置: 首页 > news >正文

C语言指针知识详解

1. 指针是什么?

首先简单来说,指针就是存储内存地址的变量,所以其本质也就是一个变量用来存储,唯一区别是存储的内容不同。

在计算机内存中,每个字节都有一个唯一的地址,就像每个房间都有门牌号一样。指针变量存储的就是这个"门牌号",通过这个地址,我们可以直接访问和操作内存中的数据。

2. 指针的基本语法

2.1 指针的声明

指针的声明使用星号(*)运算符:

int *p; // 声明一个指向整型的指针 char *c; // 声明一个指向字符的指针 float *f; // 声明一个指向浮点数的指针 double *d; // 声明一个指向双精度浮点数的指针

需要注意的是对于正常的程序代码来说,不同的类型对应的字节数是:char--1字节、short--2字节、int--4字节、long--4字节、float--4字节、double--8字节。但是对应生成的指针变量的字节数是由对应的计算机系统的位数决定的:对于16位系统指针是2字节(2*8)、对于32位系统指针是4字节(4*8)、对于64位系统指针是8字节(8*8)。

2.2 取地址运算符(&)

取地址运算符用于获取变量的内存地址:

int num = 10; int *p; // 定义整型指针p p = # // 给p赋值num的首位的地址 // 另外的写法: int *p = # printf("num的地址:%p\n", &num); // 输出num的地址 printf("指针p的值:%p\n", p); // 输出指针p存储的地址

2.3 解引用运算符(*)

解引用运算符用于通过指针访问或修改其指向的值:

int num = 10; int *p = # printf("num的值:%d\n", num); // 输出:10 printf("*p的值:%d\n", *p); // 输出:10 *p = 20; // 通过指针修改num的值 printf("修改后num的值:%d\n", num); // 输出:20

3. 指针的常见用途

3.1 动态内存分配

指针是实现动态内存分配的关键:

// 动态分配内存 int *arr = (int*)malloc(10 * sizeof(int)); if (arr == NULL) { printf("内存分配失败!\n"); return 1; } // 使用动态数组 for (int i = 0; i < 10; i++) { arr[i] = i * 2; } // 释放内存 free(arr); arr = NULL; // 避免野指针

3.2 函数参数传递

通过指针可以实现函数参数的"传址调用":

// 交换两个整数的值 // 先传入x,y的地址,然后在函数内部进行对x,y的值的取值*,从而进行交换 void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 10, y = 20; printf("交换前:x=%d, y=%d\n", x, y); // 输出:10, 20 swap(&x, &y); printf("交换后:x=%d, y=%d\n", x, y); // 输出:20, 10 return 0; }

3.3 数组与指针的关系

数组名本质上是一个指向数组首元素的常量指针:

int arr[5] = {1, 2, 3, 4, 5}; // 以下两种访问方式是等价的 printf("arr[2] = %d\n", arr[2]); // 数组下标访问 printf("*(arr+2) = %d\n", *(arr+2)); // 指针算术运算

4. 指针的高级概念

函数指针

指向函数的指针,用于回调函数等高级编程技巧:

#include <stdio.h> int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } int main() { // 1. 正确声明一个函数指针 func_ptr // 这个指针可以指向任何“返回 int 且接收两个 int 参数”的函数 int (*func_ptr)(int, int); // 2. 让指针指向 add 函数 func_ptr = add; // 通过函数指针进行调用 printf("10 + 20 = %d\n", func_ptr(10, 20)); // 输出:30 // 3. 让指针改指向 multiply 函数 func_ptr = multiply; // 再次调用 printf("10 * 20 = %d\n", func_ptr(10, 20)); // 输出:200 return 0; }
http://www.jsqmd.com/news/1255934/

相关文章:

  • 工业相机品牌挑选攻略:聚焦2D画质、线阵稳定性、面阵性价比
  • 2026孕妈平台选择攻略:拆解5大行业套路,榜首贝拉博士定义赛道天花板 - 互联网科技品牌测评
  • 心电自监督论文分享 (6)—— ST-MEM:时空掩码心电图建模
  • 多场景食用的黄桃罐头生产企业发展现状如何 - 浩了个浩
  • virtual-display-rs:Windows虚拟显示器驱动完全手册与实用指南
  • 如何安全解锁WeMod专业版功能:本地化方案终极指南
  • LosslessCut终极指南:如何快速无损剪辑视频文件
  • 长沙GEO优化服务商推荐:2026年权威推荐榜单与实测解析 - GEORANK
  • 2026年北京空调维修推荐榜单:朝阳壁挂/柜机/风管机维修、清洗移机加氟及漏水精准定位专业之选 - 卓企推荐
  • 2026PMP培训哪家好?新考纲考点深度解析+靠谱机构优选指南 - 天下观知
  • 白石山3家优质农家院榜单:登山避暑住宿推荐 - 信息热点
  • Allegro5多语言绑定实战:Python与LuaJIT游戏开发指南
  • OneNote进阶生产力:如何用OneMore插件打造专业笔记系统
  • CY0248:3000W-3500W直充充电机 IP67等级 — 户外/潮湿场景刚需
  • 实测全网 TOP1 AI 作图神器!ImageGood 不用学设计,新手随手出高级大片 - 优企甄选
  • 武汉智工职业技术学校招生简章 招生专业目录及老师咨询方式 - 武汉中职最新信息发布
  • 不同门店、不同客群、不同券:POS系统如何实现优惠券的差异化配置与自动发放
  • 2026重庆首饰回收新规实测:卡地亚、梵克雅宝、宝格丽7家门店红榜,高价合规变现指南 - 企业家观察员
  • VQFN封装PCB设计实战:从焊盘布局到焊接工艺全解析
  • 扣子API调用监控告警体系搭建(Prometheus+Grafana+自定义TraceID注入),3小时落地生产级可观测性
  • RAG 核心概念与原理:Chunking、Embedding、相似度、HNSW 与多路召回|得物技术
  • 基于YOLOv12的道路坑洼智能检测系统开发实践
  • 财务智能审核:大模型与小模型协同架构实践
  • 26年零有效投诉!武汉靠谱奢品回收机构深度测评,综合梯队划分与本地变现全攻略 - 企业家观察员
  • 白宫后量子行政令落地:后量子迁移正式进入行动阶段
  • 8 - 羟基脱氧鸟苷(8-OHdG):DNA 氧化损伤标志物,云克隆 ELISA 试剂盒助力氧化应激精准检测
  • 南京翡翠回收哪家靠谱?2026本地真实行情+正规门店无套路变现攻略 - 全国二奢机构参考
  • 如何在Windows 11上免费安装Windows安卓子系统:开发者完全指南
  • 如何在Android设备上实现微信多设备同时登录?WeChatPad平板模式终极指南
  • 佛山五大奢侈品包包回收机构对比!正规变现渠道怎么选 - 日常比对手册