- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <cstdio>
using namespace std;
int main()
{
const char *p[] = { "aa", "bb", "cc" };
const char **pp[] = { p + 2, p + 1, p };
const char ***ppp = pp;
printf("%s\n", **++ppp ); // bb
printf("%s\n", *++*++ppp); // bb
printf("%s\n", *++pp[1]); // cc
// printf("%s\n", *++(*(1+ppp))); wrong
return 0;
}
Microsoft VS2015 输出:
bb
bb
抄送
执行异常:0xC0000005
*++*++ppp
、*++pp[1]
、*++(*(1+ppp)
有什么具体区别吗?*++ppp
不是pp[1]
吗?*++ppp
不是 >*(1+ppp)
?谢谢!
最佳答案
TL;DR:是的,*++p
和 p[1]
之间存在很大差异。前者在取消引用指针之前递增指针,后者取消引用指向的元素之后的元素。返回的值是相同的,但在第一种情况下指针发生了变化。
重要提示:永远不要在生产代码中编写这样的行!您可以通过实验代码和傻瓜代码来完成此操作。但专业代码必须清晰且易于理解。
我知道一些样式指南禁止在其他表达式中使用增量运算符。他们必须坚持自己的路线。
<小时/>让我们剖析所有的行,看看它们对变量做了什么。
printf("%s\n", **++ppp ); // *(*(++p))
ppp
递增并指向 pp[1]
。内容指向 p+1
,它指向打印的 "bb"
。检查。
printf("%s\n", *++*++ppp); // *(++(*(++ppp)))
ppp
再次递增并指向 pp[2]
。取消引用和预递增让它指向p+1
。这是指向打印的 "bb"
的内容。检查。
printf("%s\n", *++pp[1]); // *(++(pp[1]))
这次您递增 pp[1]
,此后它指向 p+2
。 pp
本身无法递增,因为它是一个数组,因此 pp[1]
会递增。好的,p+2
指向打印的 "cc"
。检查。
printf("%s\n", *++(*(1+ppp))); // *(++(*(1+ppp)))
总和1+ppp
指向数组pp
之后的pp[3]
。请记住,您之前已将 ppp
递增了两次!取消引用该指针是未定义的行为,并且可以传递任何值。然后,该值被解释为指向 const char ** 的指针,您尝试再次递增和取消引用该指针。这会导致指针无效,从而引发段错误。繁荣。
这就是您可以用来调查问题以了解指针和指针数组如何工作的方法:
#include <cstdio>
using namespace std;
void print_pointers(const char *p[], const char **pp[], const char ***ppp)
{
printf("p = %p : %p %p %p\n", p, p[0], p[1], p[2]);
printf("pp = %p : %p %p %p\n", pp, pp[0], pp[1], pp[2]);
printf("ppp = %p\n", ppp);
}
int main()
{
const char *p[] = { "aa", "bb", "cc" };
const char **pp[] = { p + 2, p + 1, p };
const char ***ppp = pp;
print_pointers(p, pp, ppp);
printf("%s\n", **++ppp ); // bb
print_pointers(p, pp, ppp);
printf("%s\n", *++*++ppp); // bb
print_pointers(p, pp, ppp);
printf("%s\n", *++pp[1]); // cc
print_pointers(p, pp, ppp);
const char ***p1 = 1+ppp;
printf(" 1+ppp = %p\n", p1);
const char **p2 = *p1;
printf(" *(1+ppp) = %p\n", p2);
++p2;
printf(" ++(*(1+ppp)) = %p\n", p2);
const char *p3 = *p2;
printf("*++(*(1+ppp)) = %p\n", p3);
printf("%s\n", p3); // printf("%s\n", *++(*(1+ppp)));
return 0;
}
关于c++ - *++*++ppp, *++pp[1], *++(*(1+ppp) 有什么具体区别吗?(C/C++指针问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58889655/
#include using namespace std; int main() { const char *p[] = { "aa", "bb", "cc" }; const ch
PPP 和以太网发送 5000 字节的开销是多少? Point-to-Point Protocol 的帧大小: 8 字节MTU:500字节 以太网帧大小:18 字节MTU:1500字节 都发送 500
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
查看数据链路级标准,例如 PPP general frame format或 Ethernet ,不清楚如果校验和无效会发生什么。 协议(protocol)如何知道下一帧从哪里开始? 它是否只扫描下一
我想用 C++ 书做《编程原理与实践》第 12 章的练习。但我必须将链接器输入修改为“fltkd.lib;wsock32.lib;comctl32.lib;fltkjpegd.lib;fltkimag
我有一个 PPTP 服务器,我想在一些用户连接时做一些特别的事情(添加路由),这不应该影响其他用户。 我曾经在/etc/ppp/ip-up.d/** 中编写脚本,但我找不到一种方法来识别连接属于谁。
我正在尝试通过串行线 (RS-422) 在 iMX6 和台式机之间建立 PPP 连接。但在嵌入式系统方面,连接因错误而失败: Warning: couldn't open ppp database /
我有一个 GPRS 调制解调器,在嵌入式 Linux 中使用 PPP 连接;我需要在连接处于事件状态时获取调制解调器小时数,为此我想使用 AT 命令。但是我不知道如何将这些命令发送到调制解调器...
在this answer我读过有关 ppp.rb 的内容。它被称为“众所周知”,但在 Google 上找不到任何相关信息。 我发现它很有趣,我已将其改编为构建 my own version of ca
我正在尝试使用 USB 和 ppp 从我的 Android 设备连接到主机。 似乎有一个选项“adb ppp”可以使用。但我找不到解释关于如何使用它。这里有一个古老的讨论。但他们结束了对 adb 的修
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 1年前关闭。 Improve thi
我想将一个sf 对象转换成一个未标记的ppp。 (根据 this post,现在支持从 sf 到 ppp 的转换。) library(sf) #Initialise sf object pp Pla
为什么当我输入由空格分隔的字符串(在 while 循环之外)并且我尝试在屏幕上打印它们时,只有我输入的第一个出现,而在这个 while 循环中(见代码)它打印所有这些一个? //this one pr
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我阅读了 Stroustrup 的书 Programming Principles and Practice using C++。在第 12 章和第 441 页中有这段代码: // // This i
我们有一个解决方案,其中一些硬件连接到 Win 7 机器上的 COM 端口,并与我们的 Java 应用程序交互。硬件希望使用 PPP 服务器通过 TCP/IP 透明地连接到其他服务器。 有没有人对如何
什么是隧道(ssh 隧道和 ppp 隧道)?我在谷歌搜索,但很困惑..谁能提供一些关于这个隧道主题的好 Material ? 最佳答案 好吧,基本上你有 3 台机器: 您的机器 乙 服务器 C 远程机
在 Linux 中使用 pppd 之前,我使用了 PPP 连接,但现在我需要通过来自 C# 应用程序的 PPP 连接与硬件通信,而且我是 .net 的新手。有没有一种方法可以从应用程序中打开 PPP
我使用libpcap从PPP接口(interface)捕获数据,并添加过滤器如下: char filter_exp[] = "ip"; 但是当我在回调函数中嗅探数据包时,我发现ip数据包的格式是
我正在设计可扩展的 PPP [意味着它可以扩展到以太网、HDLC、ATM 等]。我一直在确定状态机是否由 PPP 堆栈处理[意味着我为 PPPStack 设计了基类,其中存在 FSM、编码、解码等]
我是一名优秀的程序员,十分优秀!