C语言指针简介篇

1. 指针的基本概念

  • 什么是指针: 指针是一个变量,用于存储另一个变量的内存地址。通过指针,程序可以直接访问和操作存储在内存中的数据。

  • 指针与变量的关系: 在C语言中,每个变量都有一个地址,可以使用&运算符获取变量的地址。例如,&x表示变量x的地址。指针在内存也有自己的地址,二级指针可以简单理解为指向指针的指针

2. 指针的定义与初始化

  • 指针的定义: 定义一个指针时,需要指定它所指向的数据类型。例如:

    int *ptr; // ptr是一个指向整数的指针

    指针的初始化: 指针在使用之前需要被初始化。可以通过将指针指向一个变量的地址来初始化:

  • int x = 10; int *ptr = &x; // ptr现在指向x的地址 

3. 指针的使用

  • 访问指针所指向的值: 使用解引用运算符*可以访问指针所指向的内存地址的值

    int value = *ptr; // value现在是x的值,即10
  • 修改指针所指向的值: 通过指针可以直接修改指针所指向的变量的值:

    *ptr = 20; // x的值现在变为20

4. 指针的运算

  • 指针加减法: 指针可以进行加减运算,这对于数组和动态内存分配非常有用。例如,指针加1将指向下一个同类型元素的地址:

    int arr[] = {1, 2, 3}; int *ptr = arr; // 指向数组的第一个元素 ptr++; // 现在ptr指向arr[1]
  • 指针与数组: 数组名实际上是指向数组第一个元素的指针。因此,可以使用指针遍历数组:

    for (int i = 0; i < 3; i++) { printf("%d ", *(arr + i)); // 使用指针访问数组元素 }

5. 指针的类型

  • 指向不同类型的指针: C语言支持不同类型的指针,如int*, float*, char*等。每种类型的指针在进行算术运算时,增加的值是根据指向的类型的大小来计算的。

  • 空指针: 空指针是一个不指向任何有效内存的指针,通常用NULL表示。可以使用空指针来检查指针是否已经被初始化:

    int *ptr = NULL; // ptr是一个空指针

6. 动态内存分配

  • 动态内存分配函数: C语言提供了malloc(), calloc(), realloc()free()等函数进行动态内存分配和管理。例如:

    int *arr = (int*)malloc(5 * sizeof(int)); // 分配5个整数的内存
  • 释放内存: 使用free()函数释放之前分配的内存,以避免内存泄漏:

    free(arr); // 释放动态分配的内存

7. 指针的常见问题

  • 未初始化的指针: 使用未初始化的指针(野指针)会导致未定义行为。始终在使用指针之前进行初始化。

  • 指针越界: 访问指针指向的内存范围之外的数据会导致未定义行为。确保在访问指针指向的内存时遵循边界检查。

  • 多次释放: 对同一块内存多次调用free()会导致程序崩溃。使用后,最好将指针设为NULL以避免这种情况。

  • 内存泄漏: 动态分配的内存在不再使用时应及时释放。检查每个malloc()calloc()调用,确保有对应的free()调用。

8.二级指针、指针数组、数组指针

二级指针(Pointer to Pointer)
  • 定义: 二级指针是一个指向另一个指针的指针。其类型为 type**,其中 type 是指向的基本数据类型。

  • 定义和初始化

    int x = 10; int *ptr = &x; // ptr是一个指向int的指针 int **pptr = &ptr; // pptr是一个指向指针ptr的指针

  • 使用

    • 访问二级指针所指向的值:
      printf("%d\n", **pptr); // 输出10,**pptr首先解引用到ptr,然后解引用到x

    • 修改值:
      **pptr = 20; // 通过pptr修改x的值为20 printf("%d\n", x); // 输出20
  • 应用场景: 二级指针常用于动态分配二维数组、传递多级指针到函数等场景。

2. 指针数组(Array of Pointers)
  • 定义: 指针数组是一个数组,其中的每个元素都是指向同一类型数据的指针。

  • 定义和初始化

    int *ptrs[3]; // 声明一个包含3个int指针的数组
    int a = 1, b = 2, c = 3; 
    ptrs[0] = &a; 
    // 将ptrs[0]指向a ptrs[1] = &b; 
    // 将ptrs[1]指向b ptrs[2] = &c;
    // 将ptrs[2]指向c

  • 使用

    • 访问指针数组中的值:
      for (int i = 0; i < 3; i++) { printf("%d\n", *ptrs[i]); // 输出1, 2, 3 }
  • 应用场景: 指针数组在需要处理多个指针的情况,如存储字符串数组(字符指针数组)时非常有用。

3. 数组指针(Pointer to an Array)
  • 定义: 数组指针是一个指针,用于指向整个数组,而不是数组的单个元素。其类型为 type (*)[size],其中 type 是数组元素的类型,size 是数组的大小。

  • 定义和初始化

    int arr[3] = {1, 2, 3}; int (*p)[3] = &arr; // p是一个指向包含3个int的数组的指针
  • 使用

    • 通过数组指针访问数组元素:
      //(*p)=arr
      printf("%d\n", (*p)[0]); //*(p+0)等价(*p)[0]
      // 输出1
      printf("%d\n", (*p)[1]); //*(p+1)等价(*p)[1]
      // 输出2 
      printf("%d\n", (*p)[2]); //*(p+2)等价(*p)[2]
      // 输出3
  • 应用场景: 数组指针常用于函数参数,传递一个完整的数组,而不是数组的首地址。这可以在函数中保证数组大小。

总结
  • 二级指针:指向指针的指针,常用于动态分配多维数组。
  • 指针数组:存储指针的数组,每个元素都是一个指针,适合处理多个指针。
  • 数组指针:指向数组的指针,便于在函数中传递整个数组。

 

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

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

相关文章

http增删改查四种请求方式操纵数据库

注意&#xff1a;在manage.py项目入口文件中的路由配置里&#xff0c;返回响应的 return语句后面的代码不会执行&#xff0c;所以路由配置中每个模块代码要想都执行&#xff0c;不能出现return 激活虚拟环境&#xff1a;venv(我的虚拟环境名称&#xff09;\Scripts\activate …

【论文翻译】AFLGuard: Byzantine-robust Asynchronous Federated Learning

提示&#xff1a;该论文标题为AFLGuard: Byzantine-robust Asynchronous Federated Learning&#xff0c;我将对其进行部分翻译&#xff0c;便于后续阅读。 文章目录 AFLGuard&#xff1a;拜占庭鲁棒的异步联邦学习一、摘要二、引言三、知识前提拜占庭鲁棒联邦学习 四、问题表述…

排序(插入,希尔,堆排)

常见的排序算法&#xff1a; 插入排序&#xff1a; 直接插入排序&#xff1a;是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个…

mysql如何替换数据库所有表中某些字段含有的特定值

目录 背景查询所有表名查询表的所有字段过虑特征字段替换字段中含有的特定值 背景 公司的测试域名更换了&#xff0c;导致存放在数据库中的域名也要跟着替换&#xff0c;当然把域名存放在数据库表中是不科学的&#xff0c;不建议这样做&#xff0c;但公司的同事就这样做了&…

AWS开启MFA,提高安全性

引言 多因素认证&#xff08;Multi-Factor Authentication, MFA&#xff09;是一种重要的安全措施&#xff0c;可以显著提高您的AWS账号的安全性。通过启用MFA&#xff0c;即使密码被盗&#xff0c;攻击者也难以访问您的账户。本文中九河云将详细介绍如何在AWS Management Con…

element-plus表格操作

elememt-plus安装见上文 表格的特性 element-plus中的表格和原版表格最大的不同是写法不同&#xff0c;原版表格以行的方式写&#xff0c;element-plus以列的方式写。 element-plus的表格可以更方便的展示数据&#xff0c;只需要考虑数据的格式即可。 表格标签 表格标签有两种…

LeetCode 257. 二叉树的所有路径,dfs

LeetCode 257. 二叉树的所有路径 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 目录 LeetCode 257. 二叉树的所有路径算法选择数据结构解题步骤算法流程算法代码算法分析易错点和注意事项相似题目 算法选择 深度优…

Web端云剪辑解决方案,提供多轨视频、音频、特效、字幕轨道可视化编辑

传统视频剪辑软件的繁琐安装、高昂硬件要求以及跨平台协作的局限性&#xff0c;让无数创意者望而却步。美摄科技作为云端视频编辑技术的领航者&#xff0c;携其革命性的Web端云剪辑解决方案&#xff0c;正重新定义视频创作的边界&#xff0c;让专业级视频剪辑触手可及&#xff…

k8s StorageClass 存储类

文章目录 一、概述1、StorageClass 对象定义2、StorageClass YAML 示例 二、StorageClass 字段1、provisioner&#xff08;存储制备器&#xff09;1.1、内置制备器1.2、第三方制备器 2、reclaimPolicy&#xff08;回收策略&#xff09;3、allowVolumeExpansion&#xff08;允许…

多线程:死锁

目录 死锁的条件 死锁的示例 死锁的预防与解决 死锁的检测 总结 死锁&#xff08;Deadlock&#xff09;是多线程或多进程环境中一种特定的状态&#xff0c;指的是两个或多个线程或进程在执行过程中&#xff0c;由于争夺资源而造成的一种相互等待的状态&#xff0c;导致它们…

Linux usb主机控制器HC阅读

intel的UHCI 一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver, depends on usb & pci: 它的内核软件模块代码是uhci-hcd.c uhci_hcd_init初始化开始: usb_disable函数:…

【openwrt】 libubox组件——ustream

文章目录 ustream 核心数据结构struct ustreamstruct ustream_buf_liststruct ustream_bufstruct ustream_fd ustream 核心APIustream_fd_initustream_uloop_cbustream_fd_read_pendingustream_fill_read ustream_write_pendingustream_writeustream_fd_write ustream 应用示例…

前端开发必须了解的css知识

文本过长省略显示 单行 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行 方法一&#xff1a; .ellipsis {overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 3;word-break: break-all; }方法二&#xff1a; .ellipsis {ove…

文献笔记 - Neural Lander: Stable Drone Landing ControlUsing Learned Dynamics

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者&#xff0c;文献的引用格式如下&#xff0c;原文更有价值 [1]Guanya Shi∗,Xichen Shi∗,Michael OConnell∗,et al.Neural La…

LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 你是否曾因设计一个既独特又专业的LOGO而感…

Tableau|二 如何利用功能区创建视图

一 认识 Tableau 数据 1.数据角色 维度和度量是Tableau的一种数据角色划分&#xff0c;离散和连续是另一种划分方式。 1.维度和度量 维度往往是一些分类、时间方面的定性字段&#xff0c;将其拖放到功能区时&#xff0c;Tableau不会对其进行计算&#xff0c;而是对视图区进行分…

Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见&#xff1a;学习笔记——ViT(Vision Transformer)-CSDN博客 ViT在图像分类方面的结果令人鼓舞&#xff0c;但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长&#xff0c;其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验&…

JetBrains系列产品无限重置免费试用方法

JetBrains系列产品无限重置免费试用方法 写在前面安装插件市场安装插件 写在前面 支持的产品&#xff1a; IntelliJ IDEA AppCode CLion DataGrip GoLand PhpStorm PyCharm Rider RubyMine WebStorm为了保证无限重置免费试用方法的稳定性&#xff0c;推荐下载安装2021.2.2及其…

OpenAI GPT-3 API error: “This model‘s maximum context length is 2049 tokens“

题意&#xff1a;OpenAI GPT-3 API 错误&#xff1a;“此模型的最大上下文长度是 2049 个token” 问题背景&#xff1a; I have two issues relating to the response result from OpenAI completion. 我遇到了两个与OpenAI完成响应结果相关的问题 The following result does…

Sam Altman的博客:The Intelligence Age

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…