当前位置: 首页 > 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.dtcms.com/a/315248.html

相关文章:

  • 拆解格行随身WiFi技术壁垒:Marvell芯片+智能切网引擎,地铁22Mbps速率如何实现?
  • mysql 数据库系统坏了,物理拷贝出数据怎么读取
  • 深入剖析通用目标跟踪:一项综述
  • 关于如何自定义vscode(wsl连接linux)终端路径文件夹文件名字颜色的步骤:
  • 自学嵌入式 day 42 串口通信
  • 力扣热题100——双指针
  • 应⽤层协议HTTP
  • 个推1.0版本
  • 自动化测试工具Katalon之BDD
  • 鸿蒙开发-端云一体化--云数据库
  • Qt 自动无法加载数据库为空
  • 知识管理中的人工智能:概述、主要功能和管理工具
  • 专访 Giants Protocol 创始人:新加坡主权基金正式押注进军 RWA
  • 深入理解 mmap:原理、用法与实战全解析
  • Linux 进程间通信底层原理(1):匿名与命令管道
  • LLM Prompt与开源模型资源(4)提示词工程进阶指南
  • Node.js高并发接口下的事件循环卡顿问题与异步解耦优化方案
  • 抛出自定义异常
  • 普及冲奖——贪心补题报告
  • MySQL详解
  • Docker 和Docker-compose常用命令
  • STM32标准库的工程创建
  • 推荐广告搜索三种业务的区别
  • 非机动车乱停放识别准确率↑37%:陌讯多特征融合算法实战解析
  • 04-Chapter02-Example01
  • 【cooragent多智能体】各个单智能体的输入与输出(实际案例)
  • Jmeter进阶(笔记)
  • 进程间通信:管道与共享内存
  • 亚马逊广告进阶:如何选择提曝光还是控曝光
  • 【C++】石头剪刀布游戏