首页 > 其他分享 >C语言入门:数组与指针的关系

C语言入门:数组与指针的关系

时间:2024-03-31 13:01:21浏览次数:16  
标签:释放 入门 指向 C语言 内存 数组 指针 size

目录

深入理解指针操作

指针的基本概念

指针与数组的关系

指针与函数

动态内存分配与释放

内存分配函数

内存释放函数

动态内存管理注意事项


深入理解指针操作、动态内存分配与释放是C语言编程中的核心技能。以下内容将进一步详细阐述这些主题,旨在帮助开发者更好地掌握指针的使用以及如何安全、有效地管理程序中的动态内存。

一 深入理解指针操作

A.指针的基本概念
  • 指针变量:指针变量是一个存储内存地址的变量。在声明时,需要指定指针的类型,如 int *p; 表示 p 是一个指向整型变量的指针。指针变量的值就是它所指向的内存地址。

  • 指针的初始化:指针变量在使用前必须被初始化。可以将其初始化为一个已知变量的地址,如 int x = 10; int *p = &x;,也可以初始化为 NULL 表示未指向任何有效对象。

  • 指针的解引用:使用 * 运算符可以访问指针所指向的内存位置上的值。如 printf("%d", *p); 输出 p 所指向的整数。

  • 指针的算术运算:对于指向数组或连续内存区域的指针,可以进行加减运算。加法运算使指针向后移动(增加)相应类型的大小个字节;减法运算使指针向前移动(减少)相应类型的大小个字节。例如,对于指向整型数组的指针 int *p = arr;p + 1 将指向数组的下一个元素。

  • 指针的比较:可以比较两个指针是否指向同一块内存或在内存中是否有相同的顺序。比较运算符包括 <, <=, ==, !=, >=, >

B.指针与数组的关系
  • 指针作为数组参数:函数参数传递数组时,实际上是传递数组首元素的地址。因此,形参可以声明为指针类型,如 void process_array(int *arr, size_t size)

  • 指针与数组下标:指针和数组下标操作在访问数组元素时是等价的。arr[i] 等价于 *(arr + i)

  • 指针与字符串:C语言中,字符串本质上是一个字符数组,其最后一个元素是空字符 \0。字符串字面量(如 "Hello")在编译时会转换为字符数组,并且其地址可以赋给字符指针。使用指针可以遍历字符串,检查其长度,甚至修改内容。

C.指针与函数
  • 指针作为函数参数:通过指针,函数可以修改实参的值,实现参数的双向传递。如 void swap(int *a, int *b) 可交换两个整数的值。

  • 指针作为函数返回值:函数可以返回一个指针,指向动态分配的内存或静态/全局变量。如 char *strdup(const char *src) 返回一个复制的字符串。

  • 指针与函数指针:函数指针存储的是函数的地址,可以赋值、传递和调用。如 int (*compare)(const void *, const void *) 是一个指向比较函数的指针。

二 动态内存分配与释放

A.内存分配函数
  • malloc(size_t size):分配 size 字节的连续内存空间,并返回指向该内存区域的指针。如果内存不足或分配失败,返回 NULL

  • calloc(size_t num, size_t size):分配 num 个大小为 size 字节的对象组成的内存区域,并将其初始化为零。返回指向该区域的指针。

  • realloc(void *ptr, size_t new_size):调整已分配内存区域的大小,ptr 是原分配区域的起始地址,new_size 是新大小。成功时返回指向新内存区域的指针,失败时返回 NULL,原内存区域保持不变。

  • aligned_alloc(size_t alignment, size_t size):C11新增的函数,分配对齐到 alignment(必须为2的幂)的、大小为 size 字节的内存,并返回指向该内存区域的指针。失败时返回 NULL

B.内存释放函数
  • free(void *ptr):释放由 malloccallocreallocaligned_alloc 分配的内存区域。ptr 必须为先前成功分配且未被释放的内存区域的起始地址。
C.动态内存管理注意事项
  • 避免内存泄漏:每次使用 malloc 系列函数成功分配内存后,必须在适当的时候调用 free 函数释放,否则会导致内存泄漏。

  • 检查返回值:在使用 malloccallocrealloc 分配内存后,应检查返回值是否为 NULL,以判断分配是否成功。

  • 正确释放:只能释放先前通过 malloc 系列函数成功分配的内存,释放其他内存或释放已释放的内存会导致未定义行为。

  • 避免悬挂指针:释放内存后,应将指向该区域的所有指针设为 NULL,防止后续误用这些无效指针。

  • 合理分配与释放顺序:当内存块之间存在指针交叉引用时,释放内存时应遵循“先释放子结构,再释放父结构”的原则,防止提前释放导致的悬挂指针。

通过深入理解指针操作和熟练掌握动态内存分配与释放,C语言程序员能够编写出高效、灵活且内存安全的程序。同时,良好的编程习惯,如使用智能指针、内存泄漏检测工具等,也是确保动态内存管理正确无误的重要手段。

标签:释放,入门,指向,C语言,内存,数组,指针,size
From: https://blog.csdn.net/weixin_56154577/article/details/137196571

相关文章

  • 文件系统 FTP Ubuntu 安装入门介绍
    FTP环境:Ubuntu14.04blogzh_CNubuntu14.04Install全新安装:apt-getinstallvsftpd重新安装:apt-get--reinstallinstallvsftpd卸载并清除配置文件:apt-get--purgeremovevsftpdStart&Restart$servicevsftpdstart$servicevsftpdrestart注意......
  • 00342第四章 结构化程序设计 思考题和练习题(C语言)
    一、单项选择题1.若从键盘输入字符串"HOWAREYOU?",可以直接使用库函数【】。        A.scanf    B.getstr    C.gets    D.都不能直接使用2.C语言的库函数中,可以输出double型变量值的是【】。        A.getchar   ......
  • C语言初学者
    C语言学习计划一、前言C语言,作为编程界的“常青树”,自诞生以来就以其高效、可移植性强等特点受到广大程序员的喜爱。对于初学者来说,C语言不仅可以帮助理解计算机底层的工作原理,还可以为后续学习其他高级语言打下坚实的基础。本博客将为大家提供一个系统的C语言学习计划,帮助大......
  • 【C语言终章】预处理详解(下)
      【C语言终章】预处理详解(下)  当你看到了这里时,首先要恭喜你!因为这里就是C语言的最后一站了,你的编程大能旅途也将从此站开始,为坚持不懈的你鼓个掌吧!......
  • C语言: 指针讲解
    为什么需要指针?(1)指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一......
  • spring快速入门2
    一、注解开发1.Spring_注入问题[1].强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现,强制依赖指对象在创建的过程中必须要注入指定的参数[2].可选依赖使用setter注入进行,灵活性强,可选依赖指对象在创建过程中注入的参数可有可无[3].Spring框架......
  • 大学教材《C语言程序设计》(浙大版)课后习题解析 | 第七、八章
    概述    本文主要提供《C语言程序设计》(浙大版)第七、八章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第九、十章节的课后习题解析,如想了解更多,请持续关注该专栏。专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客​http://t.cs......
  • C++与C语言
    C++之所以是C++,和面向过程的C语言相比,它加了一个类,还有一个是模板。 引入C语言这种面向过程的编译语言可以将待解的问题分解成若干个子问题,面向对象程序设计则是建立在结构化程序设计方法的基础上,完全避免了结构化程序设计方法中所存在的问题。程序=数据结构+算法(结构化......
  • C语言——倒序输出一个整数【字符篇】
    上次我们讲了如何使用数组方法倒序输出一个整数,在我们往期的学习中,我们知道,字符串可以实现很多数组类似的操作效果,那么,如何使用它来达到我们的目的呢?在C语言中,可以使用 strrev 函数直接实现倒序输出字符串。 strrev 函数用于反转字符串。使用该函数前需要包含头文件<st......
  • 大学教材《C语言程序设计》(浙大版)课后习题解析 | 第五、六章
    概述   本文主要提供《C语言程序设计》(浙大版)第五、六章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第七、八章节课后习题解析,如想了解更多,请持续关注该专栏。专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客http://t.csdnimg......