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

C语言的指针

C语言的指针

指针是C语言中一个强大而灵活的特性,它允许程序员直接操作内存地址,从而实现高效的数据处理和复杂的数据结构管理。掌握指针的概念、定义与使用方法,对于深入理解C语言及编写高效的C程序至关重要。


1 指针的概念

指针是一个变量,用于存储另一个变量的内存地址。通过指针,程序可以间接访问和修改存储在特定内存位置的数据。这种间接访问为动态内存管理、数据结构(如链表、树等)的实现提供了基础。

指针的基本概念
  • 内存地址:每个变量在内存中都有一个唯一的地址,可以通过运算符&获取。
  • 指针类型:指针变量必须声明为特定的数据类型,以确保正确地解引用和操作数据。
  • 解引用:通过指针访问其指向的变量的值,使用运算符*
指针的作用
  • 动态内存管理:通过指针动态分配和释放内存。
  • 高效数组和字符串操作:指针可以高效地遍历和操作数组和字符串。
  • 实现复杂数据结构:如链表、树、图等。
  • 函数参数传递:通过指针实现传址调用,提高函数的灵活性和效率。
示例
#include <stdio.h>int main() {int var = 20;    // 声明一个整型变量int *ptr;        // 声明一个指向整型的指针变量ptr = &var;      // 将变量var的地址赋给指针ptrprintf("var的值: %d\n", var);          // 输出 var的值printf("ptr存储的地址: %p\n", ptr);    // 输出 ptr存储的地址printf("*ptr的值: %d\n", *ptr);        // 输出指针ptr指向的值return 0;
}

输出(具体地址可能因系统而异):

var的值: 20
ptr存储的地址: 0x7ffee4b2c89c
*ptr的值: 20

详细解释

  • int *ptr; 声明了一个指向整型的指针变量ptr
  • ptr = &var; 将变量var的内存地址赋给指针ptr
  • *ptr 表示指针ptr指向的变量的值,即var的值。

2 指针变量的定义与使用

指针变量是存储内存地址的变量。正确地定义和使用指针变量是理解和掌握指针的关键。

指针变量的定义

语法

数据类型 *指针变量名;
  • 数据类型:指针所指向的数据类型,如intfloatchar等。
  • \*符号:表示这是一个指针变量。
  • 指针变量名:指针的名称。

示例

#include <stdio.h>int main() {int a = 10;float b = 5.5;char c = 'A';int *ptrA;      // 指向整型的指针float *ptrB;    // 指向浮点型的指针char *ptrC;      // 指向字符型的指针ptrA = &a;      // ptrA存储变量a的地址ptrB = &b;      // ptrB存储变量b的地址ptrC = &c;      // ptrC存储变量c的地址// 输出指针的值(内存地址)printf("ptrA 指向的地址: %p\n", ptrA);printf("ptrB 指向的地址: %p\n", ptrB);printf("ptrC 指向的地址: %p\n", ptrC);// 通过指针访问变量的值printf("*ptrA = %d\n", *ptrA);printf("*ptrB = %.2f\n", *ptrB);printf("*ptrC = %c\n", *ptrC);return 0;
}

输出(具体地址可能因系统而异):

ptrA 指向的地址: 0x7ffee4b2c89c
ptrB 指向的地址: 0x7ffee4b2c8a0
ptrC 指向的地址: 0x7ffee4b2c8a1
*ptrA = 10
*ptrB = 5.50
*ptrC = A
指针的解引用

解引用是指通过指针访问其指向的变量的值,使用运算符*

示例

#include <stdio.h>int main() {int num = 25;int *ptr = &num; // ptr指向num的地址printf("num的值: %d\n", num);       // 输出: 25printf("*ptr的值: %d\n", *ptr);     // 输出: 25*ptr = 30; // 通过指针修改num的值printf("修改后的num的值: %d\n", num); // 输出: 30return 0;
}

输出

num的值: 25
*ptr的值: 25
修改后的num的值: 30

详细解释

  • *ptr = 30; 通过指针ptr修改了变量num的值。
  • 解引用操作符*用于访问指针所指向的内存位置。
指针的类型

指针类型决定了指针解引用后访问的数据类型。不同类型的指针占用的内存大小可能不同,但在大多数现代系统中,所有指针类型通常占用相同的内存空间(如64位系统中的8字节)。

示例

#include <stdio.h>int main() {int *ptrInt;double *ptrDouble;char *ptrChar;printf("int指针的大小: %zu 字节\n", sizeof(ptrInt));       // 输出: 8printf("double指针的大小: %zu 字节\n", sizeof(ptrDouble)); // 输出: 8printf("char指针的大小: %zu 字节\n", sizeof(ptrChar));     // 输出: 8return 0;
}

输出(在64位系统中):

int指针的大小: 8 字节
double指针的大小: 8 字节
char指针的大小: 8 字节
指针的运算

指针支持有限的运算操作,包括加减整数和指针的比较。指针间的加减操作涉及到指针类型的大小。

示例

#include <stdio.h>int main() {int arr[5] = {10, 20, 30, 40, 50};int *ptr = arr; // 指向数组的第一个元素printf("ptr = %p\n", ptr);printf("ptr + 1 = %p\n", ptr + 1); // 指向下一个整数printf("*ptr = %d\n", *ptr);printf("*(ptr + 1) = %d\n", *(ptr + 1));return 0;
}

输出(具体地址可能因系统而异):

ptr = 0x7ffee4b2c890
ptr + 1 = 0x7ffee4b2c894
*ptr = 10
*(ptr + 1) = 20

详细解释

  • ptr + 1 指向数组的下一个元素,地址增加了sizeof(int)(通常为4字节)。
  • 指针运算考虑了数据类型的大小,确保指向正确的内存位置。

3 指针与数组的关系

指针和数组在C语言中有着密切的关

http://www.lryc.cn/news/610329.html

相关文章:

  • python采集拍立淘按图搜索API接口,json数据参考
  • 2.4.3-2.4.8控制成本-控制资源-监督沟通-监督干系人-监督风险-控制采购
  • 每日任务day0804:小小勇者成长记之药剂师的小咪
  • 断点续传Demo实现
  • 【目标检测基础】——yolo学习
  • 设备电机状态监测中的故障诊断与定位策略
  • HCIP笔记1
  • 微信小程序本地存储与Cookie的区别
  • 【node】如何开发一个生成token的接口
  • DolphinScheduler 集成DataX
  • 【REACT18.x】封装react-rouer实现多级路由嵌套,封装登录态权限拦截
  • 《Python 实用项目与工具制作指南》· 2.1 输入输出
  • 基于Matlab实现LDA算法
  • 【机器学习】(算法优化一)集成学习之:装袋算法(Bagging):装袋决策树、随机森林、极端随机树
  • MiDSS复现
  • 测试-概念篇(3)
  • 基于SpringBoot的OA办公系统的设计与实现
  • 【Mac】OrbStack:桌面端虚拟机配置与使用
  • 防火墙认证用户部署
  • DPDK中的TCP头部处理
  • 在安卓中使用 FFmpegKit 剪切视频并添加文字水印
  • uiautomator2 编写测试流程-登陆后的酷狗01
  • Django集成图片验证码功能:基于django-simple-captcha实现
  • MySQL Router
  • Elasticsearch Ingest Pipeline 实现示例
  • C 语言枚举、typedef 与预处理详解
  • C语言的数组与字符串
  • AI产品经理面试宝典第61天:AI产品体验、数据安全与架构实战解析
  • 倒排索引:Elasticsearch 搜索背后的底层原理
  • 无公网环境下在centos7.9上使用kk工具部署k8s平台(amd64架构)