为什么指向指针的指针与指向数组的指针不兼容?

2024-02-28

好吧,我无法理解指向指针的指针与指向数组的指针。 考虑以下代码:

char s[] = "Hello, World";
char (*p1)[] = &s;
char **p2 = &s;
printf("%c\n", **p1); /* Works */
printf("%c\n", **p2); /* Segmentation fault */

为什么第一个 printf 起作用,而第二个 printf 不起作用?

据我了解,'s'是指向数组第一个元素(即'H')的指针。 因此将 p2 声明为 char** 意味着它是一个指向 char 的指针。使其指向 's' 应该是合法的,因为 's' 是指向 char 的指针。因此取消引用它(即 **p2)应该给出“H”。但事实并非如此!


你的误解在于s是。这是not指针:它是一个数组。

现在在大多数情况下,s求值为指向数组第一个元素的指针:相当于&s[0],指向那个的指针'H'。但这里重要的是,评估时获得的指针值s是一个临时的、短暂的值——就像&s[0].

因为该指针不是永久对象(它实际上不是存储在s),你不能用指针到指针来指向它。要使用指针到指针,您必须有一个真正的指针对象来指向 - 例如,以下内容就可以:

char *p = s;
char **p2 = &p;

如果你评价*p2,你告诉编译器加载那个东西p2指向并将其视为指向字符的指针。那就好当p2实际上指向一个字符指针;但当你这样做时char **p2 = &s;,那件事p2指向根本不是一个指针 - 它是一个数组(在本例中,它是一个由 13 个元素组成的块)chars).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么指向指针的指针与指向数组的指针不兼容? 的相关文章

  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • JavaScript 数组中的负索引是否会影响数组长度?

    在javascript中我定义了一个像这样的数组 var arr 1 2 3 我也可以做 arr 1 4 现在如果我这样做 arr undefined 我也失去了对值的引用arr 1 所以对我来说 从逻辑上来说 arr 1 也是arr 但是
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐

  • 如何在objective-c中获取macos登录用户名

    请让我知道如何在 Objective C 中获取当前登录的用户名或 mac 机器名 如果可能 谢谢 There s NS用户名 http developer apple com mac library documentation cocoa
  • Spinner 不会响应点击...即使 onItemSelected 被调用?

    我的 Activity 为微调器实现了 OnItemSelected 侦听器 它有一个有趣的问题 即当活动显示时触发 onItemSelected 回调 所以我使用了一个flag hack来解决它 我讨厌它 但此时我只想让应用程序工作 奇怪
  • 为什么“libpq”使用轮询而不是通知来获取数据?

    我在读libpq参考 它有同步和异步两种方法 但是我发现了一些奇怪的事情 当我看见PQsendQuery函数 它似乎发送一个查询并立即返回 我希望有一个回调函数得到通知 但没有这样的事情 手册上说poll以保证数据的可用性 我不明白为什么异
  • Github API v3 不显示所有用户存储库

    如果我输入这个命令 curl https api github com users KiCad repos grep full name 我预计它将返回所有 KiCad 存储库 但它返回 full name KiCad Air Coils
  • Node.js 多行输入

    我想提示用户输入 让用户输入多行文本 在每行之间按 Enter 键 然后按 CTRL D 或类似的东西终止输入 使用 按键 我可以捕获 EOF 但我必须手动处理所有回显 退格处理 终端转义序列等 如果我可以使用 readline 但以某种方
  • 从命令行运行 python 脚本时 import 语句不起作用

    我需要从命令行运行 python 脚本 OS Debian wheezy python version 3 5 我使用 PyCharm 社区版 编写脚本 它在 IDE 内部运行 I used sys path append命令添加包含我想要
  • 基于最小/最大值的 Numpy 动态数组切片

    我有一个 3 维 hape 数组 365 x y 其中 36 对应 每日数据 在某些情况下 沿时间轴的所有元素axis 0 are np nan 沿线每个点的时间序列axis 0看起来像这样 我需要找到最大值 峰值数据 出现的索引 然后找到
  • Angular 2:找不到 NgModule 元数据

    我是 Angular 2 的新手 并尝试按照我找到的视频教程进行操作 尽管遵循了所有步骤 Angular 还是无法工作 我收到以下错误 compiler umd js 13854 Uncaught Error No NgModule met
  • 锁定 Android 上的 CPU 以进行应用程序性能测试

    我正在尝试测试应用程序在不同 CPU 状态下在 Android 上的性能 所以我想将 CPU 锁定在 1000Mhz 并读取读数 然后使 CPU 过载并读取读数 我的问题是 是否有办法以一定的锁定 冻结速率锁定 CPU 和可能的 RAM 任
  • 使用 Anaconda 在 OSX 上安装 GalSim 时遇到问题

    我一直在尝试在 OSX 10 9 Mavericks 上安装 GalSim 并安装了 Anaconda 并将其设置为默认 python 但遇到了以下错误 Unable to build a python loadable module us
  • 如何启动一个不是 Go 中文件的进程(例如打开网页)

    我想打开一个网络浏览器 c err exec Command http localhost 4001 Output if err nil fmt Printf ERROR v v n err c else fmt Printf OK v n
  • Ansible:如何启动已停止的服务?

    我创建了一个使用的剧本ansible facts services重新启动多个 RHEL 服务器上的特定服务 重新启动的服务以特定名称开头 并且可能存在于运行 playbook 的不同主机上 也可能不存在 我的工作正常 但我还想添加一个后续
  • 无法识别“位置”的类型。它将被视为字符串

    我正在尝试使用宝石activerecord postgis adapter当我尝试执行此代码时 require active record require pg require active record postgis adapter c
  • 我应该在onCreate还是onRestoreInstanceState中恢复savedinstancestate?

    我有一个活动启动其他一些活动以获取结果 因此当结果返回时 该活动可能已被销毁并重新创建 也可能没有 我重写了 onSaveInstanceState 以添加需要保存和恢复的数据 当 Activity 被销毁并重新创建时 onCreate 会
  • 在构造函数中初始化列表

    我需要创建一个类 该类还将两个事件列表初始化为新的空列表 我不确定这是否是对我的要求 但我知道如何创建列表以及如何创建构造函数 我创建了 2 个列表 现在我应该创建构造函数 这是我的清单之一 List
  • Android - 键盘消失时仍保留空白

    我的键盘有问题 当它消失时 它所占据的空间仍然是空白 其余布局不会调整 正常屏幕 带键盘 键盘已关闭 我以前从未见过这个 所以我什至不知道从哪里开始寻找 4 2 2 和 5 1 上都会发生这种情况 另一条重要信息是 这是一个包含所有内容的自
  • 每 n 个位置将列表中的项目插入到另一个列表

    我有以下清单 vector 1 2 3 4 5 6 7 8 9 10 inserted elements 2 2 2 2 2 我想通过插入每两个元素来得到以下结果 output 1 2 2 3 4 2 5 6 2 7 8 2 9 10 2
  • 仅连接那些非 NA 的列

    我有一个数据集 某些列的某些行中包含 NA DT lt data table ID c 1 2 1 3 A c NA NA 1 NA 3 B c 4 5 NA 5 6 C c 7 8 NA NA 9 DT ID A B C 1 1 NA 4
  • Android 模拟器 30.4.5 无法在 MacOS 上运行

    系统信息 MacOs 版本 11 3 测试版 Android Studio 版本 4 1 2 Android 模拟器版本 30 4 5 Android HAXM 版本 7 5 1 错误堆栈 emulator Android emulator
  • 为什么指向指针的指针与指向数组的指针不兼容?

    好吧 我无法理解指向指针的指针与指向数组的指针 考虑以下代码 char s Hello World char p1 s char p2 s printf c n p1 Works printf c n p2 Segmentation fau