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

news2024/11/18 17:29:19

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.coloradmin.cn/o/1492228.html

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

相关文章

22.欧拉方法、刚体模拟、流体模拟

一、一个粒子的模拟 规定一个物体在某一个时刻的速度和位置,如何解出某个时间之后它会出现在哪里 下图要求模拟一个粒子在速度场中要如何运动 速度场中,在任何一个位置,我们都有它的速度 写出来相当于是常微分方程 我们知道速度,…

find函数-秒了道题

秒了 笑死 还是规规矩矩做吧 string类的find()函数用于在字符串中查找字符或子串,返回第一个匹配的位置。 class Solution { public:int strStr(string haystack, string needle) {return haystack.find(needle);} };

基于灰狼算法GWO的城市三维无人机路径规划(复杂地形三维航迹路径规划)

摘要 本文提出了一种利用灰狼算法GWO来解决城市环境下无人机三维路径规划问题的方法。这种方法将复杂的无人机航迹规划任务转化为一个优化问题,然后运用灰狼算法GWO来解决这个优化问题。灰狼算法GWO是一种模拟灰狼种群捕猎行为的优化算法,它具备强大的全…

【TEE】内存完整性保护

Hash Functions&Merkle Tree 对读操作进行完整性检查,通过在加载的块上重新计算一个哈希,然后根据片外地址将得到的哈希与片上哈希比较。 缺点:不可承受的片上存储开销,并假设128位哈希和512位cache line,其开销为…

C++基于多设计模式下的同步异步日志系统day6

C基于多设计模式下的同步&异步日志系统day6 📟作者主页:慢热的陕西人 🌴专栏链接:C基于多设计模式下的同步&异步日志系统 📣欢迎各位大佬👍点赞🔥关注🚓收藏,&am…

JPA generator 生成实体类

1、配置生成实体类 选中表后点击右键 2、 Generate POJOs.groovy 配置 import com.intellij.database.model.DasTable import com.intellij.database.model.ObjectKind import com.intellij.database.util.Case import com.intellij.database.util.DasUtilimport java.text.S…

K次取反后最大化的数组和 加油站 分发糖果 柠檬水找零

1005.K次取反后最大化的数组和 力扣题目链接(opens new window) 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。&a…

类与对象(二)--类的六个默认成员函数超详细讲解

目录 1.类的默认六个成员函数✒️ 2.构造函数 2.1构造函数的概念✒️ 2.2构造函数的特性✒️ 3.析构函数 3.1析构函数的概念✒️ 3.2析构函数的特征✒️ 4.拷贝构造函数 4.1拷贝构造函数的概念✒️ 4.2拷贝构造函数的特征✒️ 4.3思考❓ 4.4深拷贝和浅拷贝⭐️…

嵊州吃喝玩乐篇

1. 豆腐馒头 胖大姐豆腐馒头(推荐) 地址: 嵊州市越秀路96-98号 高德地图搜 “胖大姐黄泽豆腐馒头” 黄泽豆腐馒头 地址:嵊州市越秀路111号 高德地图搜 “嵊州市玉英豆腐馒头店” 2. 烧烤 老张烧烤(推荐) 地址&a…

3.5作业

1.使用write 和 read 实现 文件夹拷贝功能&#xff0c;不考虑递归拷贝 #include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> int main(in…

#stm32学习总结GPIO

1、 GPIO 1.1、简介 就是通用输入输出口 2&#xff0c; STM32 GPIO简介&#xff08;了解&#xff09; 2.1&#xff0c;GPIO特点 1&#xff0c;不同型号&#xff0c;IO口数量可能不一样&#xff0c;可通过选型手册快速查询 2&#xff0c;快速翻转&#xff0c;每次翻转最快只…

PTA L2-009 抢红包

题目&#xff1a; 没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录&#xff0c;请你统计一下他们抢红包的收获。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤104&#xff09;&#xff0c;即参与发红包和抢红包的总人数&#xff0c;则…

【网站项目】121开放式教学评价管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

EtherCAT运动控制器在ROS上的应用(上)

本文以正运动技术EtherCAT运动控制器ZMC432和ZMC408CE为例&#xff0c;介绍正运动技术运动控制器在ROS上的应用开发。 在正式学习之前&#xff0c;我们先了解一下正运动技术的EtherCAT运动控制器ZMC432和ZMC408CE。这两款产品分别是32轴&#xff0c;8轴EtherCAT运动控制器。 …

分享Web.dev.cn中国开发者可以正常访问

谷歌开发者很高兴地宣布&#xff0c;web.dev 和 Chrome for Developers 现在都可以通过 .cn 域名访问&#xff0c;这将帮助中国的开发者更加容易获取我们的内容。 在 .cn 域名上&#xff0c;我们已向您提供所有镜像后的内容&#xff0c;并提供支持的语言版本。 Web.dev 中国开…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject&#xff1f; 在游戏开发中&#xff0c;有大量的配置数据需要存储&#xff0c;这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt&#xff0c;excel等等 但是你们有没有想过&#xff0c;假设你使用的是json&#x…

CSS全局样式的设置,JavaScript运算符

面试题&#xff1a; Html 1&#xff0c;html语义化 2&#xff0c;meta viewport相关 3&#xff0c;canvas 相关 CSS 1&#xff0c;盒模型 1.1&#xff0c;ie盒模型算上border、padding及自身&#xff08;不算margin&#xff09;&#xff0c;标准的只算上自身窗体的大小 c…

相机类型的分辨率长宽、靶面尺寸大小、像元大小汇总

镜头的靶面尺寸大于等于相机靶面尺寸。 相机的芯片长这样&#xff0c;绿色反光部分&#xff08;我的手忽略&#xff09;&#xff1a; 基本所有像素的相机的靶面大小都可以在这个表格里面找到。 镜头的靶面尺寸在镜头外表上可以找到&#xff0c;选型很重要&#xff01;

Android logcat系统

一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别&#xff1a; /…

信息安全系列04-安全启动介绍

本文框架 1. 基本概念1.1 基本概念回顾1.2 数字签名及验签流程 2. 安全启动实施2.1 信任根选择2.1.1 使用HSM作为信任根2.1.2 使用最底层Bootloader作为信任根 2.2 校验方法确认2.2.1 基于非对称加密算法&#xff08;数字签名&#xff09;2.2.2 基于对称加密算法 2.3 安全启动方…