C语言指针的初步认识--学习笔记(3)

1. 字符指针变量

       在C语言中,字符串通常被视为字符数组,但它们可以有不同的表示方式。字符指针变量存储的是字符串的地址。这意味着,当你有一个字符串时,你可以通过改变字符指针的值来改变这个字符串,因为你实际上改变的是它指向的内存地址。

      一般使用方式为:

int main()
{
const char* pstr = "hello word.";//这⾥是把⼀个字符串放到pstr指针变量⾥了吗?
printf("%s\n", pstr);
return 0;
}

       这一个代码我们很容易理解为把字符串“hello  word”放到字符指针pstr里,但是本质上是把字符串hello  word”中的首个字符‘h’的地址放入了指针pstr里。

2. 数组指针变量

2.1 数组指针变量是什么?

       学习了指针数组后,我们知道指针数组是⼀种数组,数组中存放的是地址(指针)。
数组指针变量是指针变量?还是数组?

 答案是:指针变量。

       数组指针变量是一个特殊类型的指针,它用来存储数组的地址。更准确地说,数组指针是指向数组的指针,这意味着它指向一个内存区域,该区域包含一系列相同类型的数据元素。
在C语言中,数组名本身就是一个指向数组首元素的指针。例如,如果你有一个整数数组 int arr[10];,那么 arr 就是一个指向数组首元素的指针,即 int *arr = &arr[0];。

2.2 数组指针变量怎么初始化

数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?

如果要存放个数组的地址,就得存放在数组指针变量中,如下:

这就完成了数组指针的初始化 。不过有意思的是,上面所讲的字符指针变量储存的是第一个字符的地址,数组指针变量储存的是数字中第一个整型的位置。为了防止记忆错误,这里可以讲两个变量去类似记忆。

3. ⼆维数组传参的本质

       在C语言中,二维数组传参的本质是通过指针传递数组的地址。当函数接受一个二维数组作为参数时,实际上接收的是指向数组首元素的指针。这意味着,函数中的参数是一个指针,它指向原始数组的第一个元素。
让我们来看一个例子:

        在这个例子中,printArray 函数接受一个指向整型数组的指针作为参数,该数组有10个元素。这个指针指向数组的第一个元素 arr[0][0]。函数中的 rows 参数用于知道数组有多少行。
当我们在 main 函数中调用 printArray(arr, 3); 时,实际上传递的是 arr 数组的首元素地址。在 printArray 函数中,array 指针指向的是 arr[0][0],因此我们可以通过 array[i][j] 访问原始数组的元素。
         总结来说,二维数组传参的本质是通过指针传递数组的地址,使得函数能够直接访问和操作原始数组的元素。这种传参方式在C语言中是非常常见的,因为它提供了对数组元素直接操作的灵活性,并且可以节省内存空间。

4. 函数指针变量

4.1 函数指针变量的创建

了解了整型指针,数组指针,通过类比关系,不难得出结论:
函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。
那么函数是否有地址呢?

输出结果如下:

确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的⽅式获得函数的地址。
如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针⾮常类似。如下:

函数指针类型分析:

4.2 函数指针变量的使用

    通过函数指针调⽤指针指向的函数:

输出结果为:

5. 函数指针数组

       函数指针数组是一种特殊类型的数组,其元素是函数指针。这种数组可以存储多个函数的指针,每个指针指向一个特定的函数。函数指针数组在需要多个函数但不确定哪个函数将被调用的场合非常有用,例如,在游戏编程中,根据玩家的选择调用不同的游戏功能,或者在菜单驱动的程序中,根据用户的选择执行不同的操作。         

        那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?

答案是:parr1
parr1 先和 [ ] 结合,说明parr1是数组,数组的内容是什么呢?
是 int ( * )( ) 类型的函数指针。
 

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

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

相关文章

保修期内经营者收取维修费用应遵循正当程序原则

↑↑↑“上海高院”头条号为您讲述精彩的法律科普内容 上海市第一中级人民法院在履行司法审判职能的同时,始终高度重视高质量案件工作,总结司法审判经验,努力提高司法审判质量。 在2020年全国法院系统优秀案例分析评选活动中,上海…

leetcode225.用栈实现队列

解法2:1个队列实现栈 思路:假如我有4个元素1,2,3,4需要入栈,push了之后就是顺着号是1,2,3,4如果我pop了,那我就先获取队列大小,每次先把头插入到队列末尾,然后删除头,循环执行size-1次,&#x…

合并有序链反转链表(递归版)

每日一题系列(day 19) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50…

基于RFID技术+WMS仓储管理应用设计

一、项目背景 1.1 背景 仓储管理是企业对仓库及其内部物资进行计划、组织、控制和协调的管理过程。它在整个物流和经济活动中扮演着重要的角色,连接着生产者和消费者。 不同规模和产品种类的企业有不同的仓储管理流程和需求,但核心部分都包括仓库作业…

设计模式:策略模式 ⑥

一、策略模式思想 简介 策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。…

msvcp120.dll丢失的解决方法,教你快速解决msvcp120.dll问题

msvcp120.dll是一个在Windows操作系统中至关重要的系统文件,它属于Microsoft Visual C Redistributable Package的一部分。这个动态链接库文件(DLL)包含了运行某些应用程序所必需的C运行时库函数。当某个程序在运行过程中需要调用这些预先编译…

关于制作一个Python小游戏(三)

目录 前言: 在前面我们已经了解过了关于制作pygame的使用和在里面游戏中的简单操作的内容了,今天我们主要讲的就是关于敌机的出现和如何去操控游戏中英雄飞机和敌机的出现 1.敌机的设计: 1.1敌机出场的实现: 1.1.1游戏启动后,每个一秒钟出现一架敌方飞机 1.1.2每架敌机向屏…

九章云极DataCanvas公司出席WBBA 2024宽带发展大会

2024年2月27日,由全球云网宽带产业协会(World Broadband Association, WBBA)主办的全球宽带产业盛会——宽带发展大会(Broadband Development Congress, BDC),与全球云网宽带产业合作伙伴相约巴塞罗那。九章…

【爬虫】单首音乐的爬取(附源码)

以某狗音乐为例 import requests import re import time import hashlibdef GetResponse(url):# 模拟浏览器headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0}# 发送请求…

Milvus 向量数据库实践 - 1

假定你已经安装了docker、docker-compose 环境 参考的文档如下: Milvus技术探究 - 知乎 MilvusClient() - Pymilvus v2.3.x for Milvus 一文带你入门向量数据库milvus 一、在docker上安装单机模式milvus数据库 1、 进入milvus官网: Install Milvus Stand…

微信小程序显示PDF文件

需求&#xff1a;在小程序中显示PDF文件 思路&#xff1a;wx.openDocument打开新的网页&#xff0c;显示PDF文件 <view click"showPdf">点击查看协议</view>showPdf() {// let url otption.currentTarget.dataset.index.keyValue;let url "https:…

LeetCode:1976. 到达目的地的方案数(spfa + 记忆化 Java)

目录 1976. 到达目的地的方案数 原题链接 题目描述&#xff1a; 实现代码与解析&#xff1a; spfa 记忆化 原理思路&#xff1a; 1976. 到达目的地的方案数 原题链接 1976. 到达目的地的方案数 题目描述&#xff1a; 你在一个城市里&#xff0c;城市由 n 个路口组成&a…

html 文字滚动

<marquee> 标签 创建文字滚动的标签 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>wzgd</title></head><body><marquee direction"left" height"30" width"600&q…

常见运维面试题

1. 描述Linux文件系统的结构和主要组件。 Linux文件系统的结构是层次化的&#xff0c;并且它有索引节点&#xff08;inode&#xff09;和目录项&#xff08;dentry&#xff09;等主要组件。 Linux文件系统的结构设计得非常巧妙&#xff0c;它采用了一种标准的层次化结构来组织…

python细节随笔

1:python 二维数组的创建方式 下面是创建三行两列的数组 且数组的初始元素是0 0 for i in range(2) 表示的是创建两列, 后面的 for j in range(3) 表示 这样的 我要3个 也就是3行了 a [[0 for i in range(2)] for j in range(3)] print(a) 2:数组里面的 a.index(x) 表示的是…

Qt Creator配置MSVC编译环境、调试环境

在windows上开发&#xff0c;一般使用Qt Creator自带mingw编译器&#xff0c;编译和调试都很方便&#xff0c;安装Qt时勾选后&#xff0c;自动配置完毕。 但是有时候我们需要使用MSVC的编译器&#xff0c;这个时候我们没法直接使用&#xff0c;需要配置环境才能使用&#xff0…

Leetcode 387周赛:3069, 3070, 3071

文章目录 Leetcode3069 将元素分配到两个数组中 ILeetcode3070 元素和小于等于k的子矩阵数目Leetcode3071 在矩阵上写出字母Y所需的最小操作次数 Leetcode3069 将元素分配到两个数组中 I 题目&#xff1a;给你一个下标从 1 开始、包含 不同 整数的数组 nums &#xff0c;数组长…

十秒学会Ubuntu命令行:从入门到进阶

一、引言 在使用Ubuntu操作系统时&#xff0c;命令行界面&#xff08;CLI&#xff09;是不可或缺的一部分。对于初学者来说&#xff0c;掌握基本的命令行操作可以帮助他们更高效地管理系统和软件。 本文将介绍一些常见的Ubuntu命令以及如何解决与命令行相关的问题。 目录 一、…

Java-类和对象

Scanner input new Scanner(System.in);类: 把 具有相同属性的对象 放在一起,组成一个集合public class 类名{// 定义属性: 名词数据类型 属性名; // 属性名 首字母小写,如果有多个单词,则其余首字母大写//定义方法: 动词,访问修饰符 返回值类型 方法名(){// 方法的执行内容…

基于umdf2的驱动程序

源码下载&#xff1a;https://download.csdn.net/download/mao0514/88915667 win10 64位系统vs2019wdk inf安装&#xff1a; VOID UMDF2Driver1EvtIoDeviceControl(_In_ WDFQUEUE Queue,_In_ WDFREQUEST Request,_In_ size_t OutputBufferLength,_In_ size_t InputBufferLen…