【C语言】指针详解:概念、类型与解引用

news2025/2/5 14:28:44

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C语言

文章目录

  • 💯前言
  • 💯指针的基本概念
    • 1. 什么是指针
    • 2. 指针的基本操作
  • 💯指针的类型
    • 1. 指针的大小
    • 2. 指针类型与所指向的数据类型
    • 3. 指针类型与数据访问的关系
    • 4. 指针类型的实际意义
  • 💯指针解引用与内存访问
    • 1. 指针解引用的影响
    • 2. 不同类型指针的解引用结果
  • 💯指针的实际应用
    • 1. 动态内存分配
    • 2. 数组与指针
    • 3. 指针与结构体
  • 💯小结

在这里插入图片描述


在这里插入图片描述


💯前言

  • 在C语言中,指针是一个至关重要的概念。理解指针是理解C语言内存管理和高效编程的基础。指针使得程序可以直接操作内存,进行动态内存分配和高效的数据访问。许多C语言程序设计中的高级操作都依赖于指针,如数组操作、字符串处理以及函数传参等。
    本篇文章将详细介绍C语言中的指针,涉及指针的定义、指针类型、指针的解引用操作、指针的实际应用等内容,帮助你深入理解指针在C语言中的作用。
    C语言
    在这里插入图片描述

💯指针的基本概念

1. 什么是指针

指针是一个特殊的变量,它存储了另一个变量的内存地址。指针的作用是让程序员能够直接操作内存,在进行大规模数据操作时,指针能够大大提高程序的效率。

例如,定义一个int类型的指针,并指向一个int变量:

#include <stdio.h>

int main() {
    int num = 10;
    int *p = &num; // p是一个指向int类型的指针,存储num的地址
    printf("num = %d", num);
    printf("p = %p", p);  // 打印p存储的地址,即num的地址
    printf("*p = %d", *p); // 通过*p访问num的值
    return 0;
}
  • int *p = &num;p是一个指向int类型的指针,它存储了变量num的内存地址。
  • *p:解引用操作符,它表示访问p所指向的内存地址的值,即num的值。

2. 指针的基本操作

指针有两个常用操作:

  • 获取地址(&):用来获取一个变量的内存地址。
  • 解引用(*):用来访问指针所指向的内存地址的内容。

例如:

int num = 10;
int *p = &num;   // 获取num的地址并赋值给指针p
printf("*p = %d", *p); // 解引用,输出num的值

💯指针的类型

在C语言中,指针的类型不仅决定了指针本身的大小,还决定了指针解引用时的内存访问方式。指针类型非常重要,它决定了如何访问指针所指向的数据,并且能够确保访问时的正确性。

1. 指针的大小

指针的大小与系统架构相关,而与指针所指向的数据类型无关。指针本身只存储一个内存地址,这个地址的大小是由操作系统和处理器架构(32位或64位)决定的。

  • 在32位系统上,所有指针的大小通常为4字节,因为32位系统能够寻址2^32个内存位置,因此每个内存地址需要4字节来表示。
  • 在64位系统上,指针的大小通常为8字节,因为64位系统能够寻址2^64个内存位置,每个内存地址需要8字节来表示。

不管你声明的是int*char*,还是double*,它们的指针类型的大小都是由操作系统的位数决定的,而不是由它们指向的数据类型决定的。指针类型仅仅决定了如何解析内存中的数据。

2. 指针类型与所指向的数据类型

指针的类型决定了指针向前或者向后走一步有多大(距离)。

尽管指针的大小由系统架构决定,但指针类型与它所指向的数据类型直接相关。指针类型决定了指针解引用时的内存访问“步长”——即每次访问内存时,指针会跳过多少个字节。

例如:

#include <stdio.h>

int main() {
    int num = 10;
    char *pc = (char *) &num; // 将num的地址强制转换为char类型的指针
    int *pi = &num;            // 将num的地址赋给int类型的指针

    printf("pc = %p, pi = %p", pc, pi);
    printf("*pc = %d, *pi = %d", *pc, *pi); // 访问不同类型的数据
    return 0;
}

在这段代码中:

  • char* pc 是指向char类型的指针,因此解引用时它会按字节(1字节)访问内存。
  • int* pi 是指向int类型的指针,因此解引用时它会按4字节(在32位系统上)访问内存。

3. 指针类型与数据访问的关系

指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

  • char*指针:用于访问单个字节的数据,通常用于操作字符串等。
  • int*指针:用于访问整型数据,它会跳过4个字节(32位系统上的int类型大小)。
  • double*指针:用于访问双精度浮点数,它通常跳过8个字节(在64位系统上)。

4. 指针类型的实际意义

指针类型决定了当我们使用解引用操作时,如何访问内存中的数据。例如,如果我们用一个char*类型的指针去访问int类型的数据,可能会导致程序崩溃或不正确的结果。了解指针类型是确保程序正常运行的重要一环。

💯指针解引用与内存访问

指针的解引用操作允许程序直接访问内存。通过解引用,我们可以获取指针指向地址上的数据,这使得指针在C语言中的使用非常灵活。

1. 指针解引用的影响

当我们解引用指针时,C语言会根据指针的类型来决定如何解析内存。具体来说,指针类型决定了解引用时的“步长”,即它访问内存的单位大小。

例如:

int num = 10;
char *pc = (char *) &num;  // 将int的地址赋给char指针
int *pi = &num;            // 将num的地址赋给int指针

printf("*pc = %d", *pc); // 解引用char*指针
printf("*pi = %d", *pi); // 解引用int*指针
  • *pc:按char类型解引用,它访问内存中的1个字节。
  • *pi:按int类型解引用,它访问内存中的4个字节(32位系统上)。

2. 不同类型指针的解引用结果

不同类型的指针在解引用时,会影响内存的访问方式。如果指针类型和数据类型不匹配,可能导致访问错误或内存越界。

💯指针的实际应用

指针在C语言中有着广泛的应用,特别是在以下几个方面,指针的作用尤为重要:

1. 动态内存分配

通过指针,我们可以在程序运行时动态地分配内存。这为开发复杂数据结构提供了强大的支持。例如,使用malloc函数来动态分配内存:

int *p = (int *)malloc(sizeof(int) * 10); // 动态分配10个int类型的空间
if (p == NULL) {
    printf("Memory allocation failed!");
    return 1;
}

这段代码动态分配了10个int类型的内存空间,p是一个指针,它指向这块内存。动态内存分配使得我们能够在程序运行时灵活地控制内存使用。

2. 数组与指针

在C语言中,数组名本质上是指向数组首元素的指针。因此,我们可以通过指针直接操作数组元素:

int arr[] = {1, 2, 3, 4, 5};
int *p = arr; // 数组名`arr`等价于指向数组第一个元素的指针

printf("%d", *(p + 2)); // 访问数组中的第三个元素

通过指针,访问数组元素可以更加灵活高效。此外,指针在函数传参时尤其有用,因为它允许我们传递大型数据结构(如数组或结构体)而不必复制数据。

3. 指针与结构体

指针可以指向结构体,并使我们能够直接操作结构体的内容。这对于在内存中动态管理复杂数据结构非常有用:

#include <stdio.h>

struct Student {
    char name[20];
    int age;
};

int main() {
    struct Student student = {"Alice", 20};
    struct Student *p = &student;

    printf("Name: %s, Age: %d", p->name, p->age);
    return 0;
}

在这个例子中,我们定义了一个结构体Student,并使用指针p来访问结构体中的成员变量。

💯小结

C语言中的指针是一个功能强大的工具,允许程序直接访问内存,进行高效的内存管理和数据处理。指针类型的选择不仅决定了指针的大小,还决定了通过指针访问数据时的内存步长。指针的解引用操作使得我们能够访问指针所指向的数据,并通过类型的正确使用避免内存越界等潜在问题。

指针在C语言中的应用非常广泛,包括动态内存分配、数组和结构体操作等。掌握指针的使用不仅能帮助我们更好地理解C语言的内存管理,还能在复杂程序中提高效率和可维护性。希望本篇文章能够帮助你更好地理解指针,并在实际编程中充分利用这一重要工具。


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2292350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OS】AUTOSAR架构下的Interrupt详解(上篇)

目录 前言 正文 1.中断概念分析 1.1 中断处理API 1.2 中断级别 1.3 中断向量表 1.4 二类中断的嵌套 1.4.1概述 1.4.2激活 1.5一类中断 1.5.1一类中断的实现 1.5.2一类中断的嵌套 1.5.3在StartOS之前的1类ISR 1.5.4使用1类中断时的注意事项 1.6中断源的初始化 1.…

UE编辑器工具

如何自己制作UE小工具提高工作效率 在虚幻编辑器用户界面中&#xff0c;可以使用各种各样的可视化工具来设置项目&#xff0c;设计和构建关卡&#xff0c;创建游戏性交互等等。但有些时候&#xff0c;当你确定了需要编辑器执行的操作后&#xff0c;可能想要通过编程方式调用它…

【Linux】25.进程信号(2)

文章目录 4.捕捉信号4.1 重谈地址空间4.2 内核如何实现信号的捕捉4.3 sigaction4.4 可重入函数4.5 volatile4.6 SIGCHLD信号&#xff08;了解&#xff09; 4.捕捉信号 4.1 重谈地址空间 用户页表有几份&#xff1f; 有几个进程&#xff0c;就有几份用户级页表–进程具有独立性…

洛谷 P1387 最大正方形 C语言

题目描述 在一个 n m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形&#xff0c;输出边长。 输入格式 输入文件第一行为两个整数 n, m (1 ≤ n, m ≤ 100)&#xff0c;接下来 n 行&#xff0c;每行 m 个数字&#xff0c;用空格隔开&#xff0c;0 或 1。 输出格式 …

ChatGPT提问技巧:行业热门应用提示词案例--咨询法律知识

ChatGPT除了可以协助办公&#xff0c;写作文案和生成短视频脚本外&#xff0c;和还可以做为一个法律工具&#xff0c;当用户面临一些法律知识盲点时&#xff0c;可以向ChatGPT咨询获得解答。赋予ChatGPT专家的身份&#xff0c;用户能够得到较为满意的解答。 1.咨询法律知识 举…

[吾爱出品]CursorWorkshop V6.33 专业鼠标光标制作工具-简体中文汉化绿色版

CursorWorkshop V6.33 专业鼠标光标制作工具 链接&#xff1a;https://pan.xunlei.com/s/VOIFeq5DFB9FS56Al_mT2EfdA1?pwd7ij4# 产品概述 Axialis CursorWorkshop 是一个专业光标创作工具它在 Windows 下运行&#xff0c;让您轻松创建高质量的静态和动态光标适用于 Windows …

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

LabVIEW涡轮诊断系统

一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备&#xff0c;其运行状态直接关系到生产安全与经济效益。据统计&#xff0c;涡轮故障导致的非计划停机可造成每小时数十万元的经济损失&#xff0c;且突发故障可能引发严重安全事故。传统人…

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群&#xff0c;就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间&#xff0c;你要同时应对许多变动的因素。对于许多配置而言&#xff0c;使用二层&#xff08;L2&#xff09;网络就完全能满足需求。但边界网关…

大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》

论文链接&#xff1a;https://arxiv.org/abs/2402.06196 摘要&#xff1a;自2022年11月ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLMs&#xff09;因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样&#xff0c;大语言模型通过在大量文本数…

物理群晖SA6400核显直通win10虚拟机(VMM)

写在前面&#xff1a;请先确保你的核显驱动支持开启SR-IOV 确保你的BIOS开启了以下选项&#xff1a; VT-D VMX IOMMU Above 4G ResizeBAR 自行通过以下命令确认支持情况&#xff1a; dmesg | grep -i iommudmesg | grep DMAR分配1个虚拟vGPU&#xff1a;echo 1 | sudo tee /sy…

【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】tkinter实现音乐播放器&#xff08;源码…

MyBatis-Plus速成指南:常用注解

Table Name: 概述&#xff1a; MyBatis-Plus 在确定操作的表时&#xff0c;由 BaseMapper的泛型决定&#xff0c;即实体类决定&#xff0c;且默认操作的表名和实体类的类名一致 问题&#xff1a; 如果实体类类型的类名和要操作表的表名不一致会出现什么问题&#xff1f;(把 us…

Linux 压缩打包

Linux压缩打包 文章目录 Linux压缩打包压缩的意义和原理压缩的意义压缩的原理压缩与解压缩的好处 压缩打包命令.zipzip 命令用法unzip 的用法 .gzgzip 的用法gunzip 的用法 .bz2bzip2 的用法bunzip2 的用法 .xzxz 命令用法 tar 04-Linux压缩打包课后习题 压缩的意义和原理 压缩…

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

智慧校园平台:构建现代化教育体系的技术支撑

在当今信息技术飞速发展的时代&#xff0c;智慧校园平台成为了现代教育领域中的重要组成部分。智慧校园平台不仅能够提升学校的管理水平&#xff0c;还能提供更为个性化和高效的教学服务&#xff0c;从而促进学生的全面发展。 数据分析是智慧校园平台的重要组成部分。通过对学生…

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash 2025/2/4 23:45 百度&#xff1a;dash bash https://blog.csdn.net/2201_75772333/article/details/136955776 【Linux基础】dash和bash简介 Dash&#xff08;Debian Almquist Shell&#xff09;和 Bash&#xff08;Bou…

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang&#xff08;也称为 Go&#xff09;通过通道&#xff08;channels&#xff09;这一特性&#xff0c;能够可靠且优雅地实现并发通信。本文将揭示通道的概念&#xff0c;解释其在并发编程中的作用&#xff0c;并提供…

可视化大屏在石油方面的应用。

可视化大屏通过整合石油工业全链条数据&#xff0c;构建数字孪生驱动的运营监控体系&#xff0c;显著提升油气勘探、开采、储运及炼化的管理效能。其技术架构依托工业物联网&#xff08;IIoT&#xff09;实时采集钻井参数、管道压力、储罐液位等数据&#xff0c;通过OPC UA协议…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网&#xff1a;www.acvra.org 简介 2025年计算机视觉研究进展与应用&#xff08;ACVRA 2025&#xff09;将于2025年2月28-3月2日在中国广州召开&#xff0c;将汇聚世界各地的顶尖学者、研究人员和行业专家&#xff0c;聚焦计算机视觉领域的最新研究动态与应用成就。本次…