指针

C语言中指针数组和指向指针的指针详解 指针数组(Array of Pointers)是一种特殊的数组,其中每个元素都是一个指针。指针数组通常用于处理字符串数组、动态数组等复杂数据结构。数据类型 *数组名[数组大小];指向指针的指针(Pointer to Pointer)是一个指针,它指向另一个指针。它通常用于处理多级间接引用和复杂的数据结构。数据类型 **指针名;int **p;指针数组和指向指针的指针是C语言中两个重要的概念。它们在处理动态数组、多级数据结构和复杂算法时非常有用。 阅读详情
 

一. 回顾指针概念:
早在本系列第二篇中我就对指针的实质进行了阐述。今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!
当我们程序如下申明变量:
short int i;
char a;
short int * pi;
程序会在内存某地址空间上为各变量开辟空间,如下图所示。
内存地址→6     7      8     9     10     11    12    13     14    15
-------------------------------------------------------------------------------------
…  |     |      |      |      |      |       |      |      |      |  
-------------------------------------------------------------------------------------
    |short int i |char a|      |short int * pi|
图中所示中可看出:
i 变量在内存地址5的位置,占两个字节。
a变量在内存地址7的位置,占一个字节。
pi变量在内存地址9的位置,占两个字节。(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节)
接下来如下赋值:
i=50;
pi=&i;
经过上在两句的赋值,变量的内存映象如下:
内存地址→6     7      8     9     10     11    12    13      14     15
--------------------------------------------------------------------------------------
…  |    50      |      |      |    6         |      |      |       |  
--------------------------------------------------------------------------------------
    |short int i |char a|      |short int * pi|
看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。如:
*pi=5;   //就是等价于I=5;
你可以回看本系列的第二篇,那里有更加详细的解说。

二. 指针的地址与指向另一指针地址的指针
在上一节中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10。同样的,我们也可能让某个指针指向这个地址。
看下面代码:
short int * * ppi;    //这是一个指向指针的指针,注意有两个*号
ppi=π

第一句:short int * * ppi;——申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个short int * 类型指针变量的地址。
第二句:&pi那就是取pi的地址,ppi=π就是把pi的地址赋给了ppi。即将地址值10赋值给ppi。如下图:
内存地址→6     7      8     9     10     11    12    13       14    15
------------------------------------------------------------------------------------
…  |    50     |      |      |      6       |       10      |      |  
------------------------------------------------------------------------------------
    |short int i|char a|      |short int * pi|short int ** ppi|
从图中看出,指针变量ppi的内容就是指针变量pi的起始地址。于是……
ppi的值是多少呢?——10。
*ppi的值是多少呢?——6,即pi的值。
**ppi的值是多少呢?——50,即I的值,也是*pi的值。
呵呵!不用我说太多了,我相信你应明白这种指针了吧!

三. 一个应用实例
1. 设计一个函数:void find1(char array[], char search, char * pi)
要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。
设计:依题意,实现代码如下。
void find1(char [] array, char search, char * pa)
{
   int i;
   for (i=0;*(array+i)!=0;i++)
   {
      if (*(array+i)==search)
      {
        pa=array+i
        break;
      }
      else if (*(array+i)==0)
      {
        pa=0;
        break;
      }
   }
}
你觉得这个函数能实现所要求的功能吗?
调试:
我下面调用这个函数试试。
void main()
{
  char str[]={“afsdfsdfdf/0”};  //待查找的字符串
  char a=’d’;   //设置要查找的字符
  char * p=0;  //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。
  find1(str,a,p);  //调用函数以实现所要操作。
  if (0==p )
  {
     printf (“没找到!/n”);//1.如果没找到则输出此句
  }
  else
  {
     printf(“找到了,p=%d”,p);  //如果找到则输出此句
  }
}
分析:
上面代码,你认为会是输出什么呢?
运行试试。
唉!怎么输出的是:没有找到!
而不是:找到了,……。
明明a值为’d’,而str字符串的第四个字符是’d’,应该找得到呀!
再看函数定义处:void find1(char [] array, char search, char * pa)
看调用处:find1(str,a,p);
依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。
整个调用如下:
   array=str;
   search=a;
   pa=p;    //请注意:以上三句是调用时隐含的动作。
   int i;
   for (i=0;*(array+i)!=0;i++)
   {
      if (*(array+i)==search)
      {
        pa=array+i
        break;
      }
      else if (*(array+i)==0)
      {
        pa=0;
        break;
      }
   }
哦!参数pa与参数search的传递并没有什么不同,都是值传递嘛(小语:地址传递其实就是地址值传递嘛)!所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。
(如果还有疑问,再看一看《第五篇:函数参数的传递》了。)
修正:
void find2(char [] array, char search, char ** ppa)
{
   int i;
   for (i=0;*(array+i)!=0;i++)
   {
      if (*(array+i)==search)
      {
        *ppa=array+i
        break;
      }
      else if (*(array+i)==0)
      {
        *ppa=0;
        break;
      }
   }
}
主函数的调用处改如下:
  find2(str,a,&p);  //调用函数以实现所要操作。
再分析:
这样调用函数时的整个操作变成如下:
   array=str;
   search=a;
   ppa=&p;    //请注意:以上三句是调用时隐含的动作。
   int i;
   for (i=0;*(array+i)!=0;i++)
   {
      if (*(array+i)==search)
      {
        *ppa=array+i
        break;
      }
      else if (*(array+i)==0)
      {
        *ppa=0;
        break;
      }
   }
看明白了吗?
ppa指向指针p的地址。
对*ppa的修改就是对p值的修改。
你自行去调试。
经过修改后的程序就可以完成所要的功能了。

C语言指针基础知识点(三)--指针变量作为函数参数 前期回顾 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 指针变量作为函数参数    函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。 栗子: 对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。 #include <stdio.h> int... 阅读详情

相关推荐

【C语言指针数组】——指向指针的指针

因此,在处理更复杂的程序时,应该谨慎使用它们。但是在某些情况下,它们可以帮助我们更高效地处理数据和内存。指针数组是一个数组,其元素都是指针。每个元素都可以指向另一个指针或变量。在声明指针数组时,需要使用星号(*)来指定元素类型为指针。在C语言中,我们可以使用指针来处理数组。但有时候,我们需要处理的数组本身是指针。指针数组通常用于存储一组指针,例如字符串数组。,其中每个元素都是指向字符的指针。我们可以使用循环访问每个元素,并打印出其值。在这个例子中,我们定义了一个指针数组。

qq_37934722的博客 305

彻底搞定C指针-指向另一指针的指针

 一. 回顾指针概念:早在本系列第二篇中我就对指针的实质进行了阐述。今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!当我们程序如下申明变量:short int i;char a;short int * pi;程序会在内存某地址空间上为各变量开辟空间,如下图所示。内存地址→6     7      8     9     10     11    12    13 

要饭's Blog 2565

从零到一:手把手教你构建工业级Modbus转MQTT网关(STM32+ESP8266实战)

本文详细介绍了如何利用STM32和ESP8266构建工业级Modbus转MQTT网关,涵盖硬件选型、代码示例、协议转换及稳定性设计。重点解析Modbus RTU与MQTT协议对接阿里云物联网平台的实战步骤,确保数据可靠传输与长期稳定运行,为工业物联网应用提供完整解决方案。

u0v1w2x3的博客 684

C语言指针操作(二)指针变量作为函数参数

指针变量作为函数参数详解,形参和实参之间的值传递如何传递?如何改变指针变量所指向的变量?函数的参数不仅可以是整型,浮点型,字符型等数据,还可以是指针类型;它的作用是将一个变量的地址传送到另一个函数中。

伯努利 7026

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

基于STM32的3D打印机控制

通过本项目,我们成功搭建了一个基础的3D打印机控制系统,能够控制步进电机和加热元件。这为使用STM32开发功能丰富的3D打印机提供了基础,您可以在此基础上继续扩展功能,如增加LCD显示、SD卡存储、联网控制等功能。在这个项目中,我们将使用STM32微控制器开发一个基础的3D打印机控制系统。通过控制步进电机、加热元件和温度传感器,我们将实现一个简单的FDM(熔融沉积制造)3D打印机控制。- 检查PWM信号的生成功能,确认加热元件的控制逻辑是否正常。- 增加适当的滤波和校准算法,以提高温度读取的准确性。

2401_88938661的博客 1502

为什么要用指针,什么时候该用指针,什么时候该用指针的指针

什么是指针,什么时候要用指针,什么时候要用指针的指针,指针传参时的注意事项,C语言传递参数的实质,内存分配

Diode的博客 6292

VisionPro 9.0 QuickBuild里用C#脚本调用Halcon 23.11模型,保姆级图文配置流程

本文详细介绍了如何在VisionPro 9.0 QuickBuild环境中使用C#脚本调用Halcon 23.11深度学习模型,提供从环境配置到模型集成的保姆级图文教程。重点解决图像格式转换、许可证配置等工业视觉检测中的常见问题,帮助开发者快速实现高效、稳定的视觉检测流水线部署。

weixin_27027459的博客 432

指针和指针变量

如果不初始化,p由可能指向任何地方,这种指针称之为野指针,通过野指针去改变指向的不确定的地址的行为是很危险的。对于使用钥匙打开房间A和房间B的效果是一致的,但是内容的交换要比钥匙的交换开销要大得多!①可以进行的算术运算,只有以下几种:px±n,px++/++px,px–/–px,px-py。指针变量pnum的值就是变量num的地址,指针与指针变量的区别,就是变量值与变量的区别。所以在定义指针变量的时候,如果暂时没有明确的指向,对其一般初始化为NULL(空指针)对没有指向的指针变量进行操作,是很危险的事情。

cai88453626的博客 7468

大数据领域数据架构的工业互联网数据架构设计

工业互联网作为第四次工业革命的重要驱动力,正在深刻改变传统制造业的生产方式和商业模式。本文旨在探讨工业互联网环境下的大数据架构设计,重点解决工业数据采集、传输、存储、处理和分析等关键环节的技术挑战。工业互联网数据架构的核心组件大数据技术在工业场景下的应用数据治理和质量控制边缘计算与云计算的协同架构背景介绍:建立基本概念和问题域核心架构:详细解析工业互联网数据架构技术实现:通过代码和数学模型展示关键技术实践案例:展示真实场景应用工具资源:推荐实用开发工具和学习资源。

软件工程实践的博客 855

2026年全国青少年信息素养大赛算法应用主题赛C++样题及答案解析

2026年全国青少年信息素养大赛算法应用主题赛C++样题

王老师青少年编程 3711

深入了解指针,指针数组,数组指针。

大家可能听说过这样一句话,没学过指针就是没学过C语言。指针确实时C语言的一大特色,更是C语言的一大核心。但是指针的学习也没有大家想象的这么难。今天就带大家一起来深入学习一下指针。...

qq_63943454的博客 1719

小红书urlscheme和Activity

本文档详细介绍了小红书App的Deeplink跳转规范,涵盖了多个功能模块的跳转协议。主要内容包括:主页各Tab(关注、发现、购买)的跳转方式;不同类型笔记(图文/视频/长笔记)的详情页跳转参数;用户相关页面(主页/绑定/资料/消息等)的跳转协议;搜索功能(输入页/结果页)的跳转方式;以及话题、标签、专辑、H5页面等特殊场景的跳转实现。文档还提供了各跳转协议所需的参数说明,包括参数类型、默认值、是否必填等详细信息,并标注了不同版本和平台的兼容性要求。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 785

指针 指针数组 指针数组的指针 数组指针 数组指针的数组 函数指针 指向函数指针数组的指针

指针 指针数组 指针数组的指针 数组指针 数组指针的数组 函数指针 函数指针数组 指向函数指针数组的指针

zhang1308299607的博客 4805

手把手教你学Simulink——基于Simulink的固态变压器(SST)多级协同控制

摘要:本文详细介绍了基于Simulink的固态变压器(SST)多级协同控制方法。SST作为新一代智能电网核心设备,通过AC-DC整流、DC-DC隔离和DC-AC逆变三级架构实现电能高效转换。针对多级耦合难题,提出能量-功率协同控制策略:纵向解耦电压环与功率前馈,横向联动级间功率指令。在Simulink中搭建10kV/400V系统模型,实现直流母线电压波动<2%的动态性能。特别设计了负载突变时的三级协同机制,通过虚拟惯性算法和前馈控制实现快速响应。文章包含完整的建模步骤、控制推导和参数设置,为电力电子工

MHD0815的博客 192

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

35 多级指针、空指针、野指针、悬挂指针

本文全面探讨了 C/C++ 编程中指针的复杂性和潜在风险,包括指向指针的指针(多级指针)的定义与使用、空指针、野指针以及悬挂指针的概念、成因及避免方法。文章通过详细解析和案例演示,帮助读者深入理解这些指针类型及其在实际编程中的应用和注意事项。同时,文章还提供了空指针、野指针、悬挂指针对比总结以及指针使用一览表,为读者提供了一份实用的指针使用指南。

大模型全栈工程师 · Thanks_ks 1442

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

带你认识什么是一级指针、二级指针、三级指针

今天带大家了解一下什么是一级指针、二级指针、三级指针 1、一级指针 一级指针其实就是我们平时常见的普通指针 如: int a = 12; int * b = &a; //一级指针,定义一个指针变量b,将整型变量a的地址(指针)赋值给b 所以首先我们介绍一下什么是指针? 指针其实是一个内存地址,对于一个内存单元来说,单元的地址即为指针。 而我们平时常用的指针则是指针变量。 指针变量从字面意思上可以看出是存储指针的一种变量类型。 在C语言中,允许用一个变量来存放指针,这种变量称为指针

OMGMac的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C语言】指针篇(指针数组,数组指针,函数指针,一级、二级指针)

本篇包含了指针所有的知识点,包括指针的使用方法,野指针问题,指针类型的判断,一级指针,二级指针,指针常量和常量指针,指针数组和数组指针,数组传参和指针传参,函数指针和函数指针数组,以及指向函数指针数组的指针,回调函数等等。

炸掉地球的博客 2042

变量指针与指针变量,数组指针与指针数组

本文介绍了指针变量作为函数参数的使用方法,重点讲解了通过指针间接修改实参数据的两种方式:交换指针指向和交换指针指向的数据。同时详细阐述了指针变量与数组元素的关系,指出数组名即代表数组首地址,可以用指针变量指向数组元素。文章还系统总结了指针运算的6种常见操作,包括自增、自减、加减n个元素、指针相减和比较等,并强调了指针运算必须在同一数组内进行。最后通过多个案例演示了如何用下标法和指针法遍历数组,展示了指针与数组的灵活结合应用。

Dd000110的博客 1857

一文搞懂指针,指针的指针,悬浮指针,野指针

一文搞懂指针,指针的指针,悬浮指针,野指针 学习C语言过程中,指针的概念往往是重难点,伴随着时隐时显的*,令人头晕。实际上指针并非如此复杂,掌握最基础概念,有利于我们更深刻的理解指针。 【百科概念】 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 【初识

weixin_45399399的博客 2605

指针作用、指针与指针变量、指针的定义与初始化、指针赋值

指针

csdn_lfy的博客 3704

野指针,数组指针,指针数组

目录:1.野指针(1)什么是野指针?(2)野指针的成因a.指针为初始化b.指针访问越界2.指针数组和数组指针(1)指针数组(2)数组指针(3)指针数组和数组指针+1的区别 1.野指针 (1)什么是野指针? 野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的) (2)野指针的成因 a.指针为初始化 全局变量,静态变量未初始化默认是会初始化的,默认是0 其他变量都不会初始化,默认是随机值 eg: #include<stdio.h> int main() { int* p; //局

HanMeng的博客 3052

C++——指针、无效指针、空指针、void*指针、指向指针的指针、指针和const、指针和数组

本文介绍C++指针的相关内容...

HuoZhiyan 的博客 1203

指针,数组指针,指针数组,函数指针解析

文章目录前言一、指针是什么?1.1内存和地址1.2 * 运算符和 &运算符1.3创建指针变量1.4int* p的解释二、数组指针指针数组2.1 数组指针和指针数组的理解2.2 数组指针和指针数组的定义方式2.3 代码分析三、函数指针3.1 函数指针的概念3.2 函数指针的定义3.3 函数指针的使用四、套娃4.1套娃开始4.2 套娃解释4.3 疯狂疯狂套娃 前言 指针可以说是C语言最强大的功能之一,通过指针可以直接访问内存。然而指针也是C语言中非常难掌握的知识点之一。如果可以灵活地使用指针,基本上可以

fyadf的博客 728

指针、野指针、指针常量、常量指针

指针 概念 指针是什么? 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 内存地址 字节(byte):字节是内容的容量单位,英文称为byte,一个字节有8位,即1byte = 8bits 字(word):4byte = 1字 半字:2Byte 地址:系统为了便于区分每一个字节而对它们逐一进行

HZS8520223520的博客 1417
上一篇: 今天温习汇编
下一篇: windows下堆溢出
gyssoft
博客等级 码龄20年 25粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值