考虑以下程序:
#include <iostream>
int const * f(int const &i)
{
return &i;
}
int main()
{
std::cout << f(42); // #1
std::cout << f(42); // #2
std::cout << f(42) << f(42); // #3
}
Run Code Online (Sandbox Code Playgroud)
根据编译器和设置的优化级别,打印在行上的地址可能彼此不同#1,#2也可能不同。
但是,无论选择何种编译器或优化级别,行#3中打印的 2 个地址总是彼此不同。
这是一个可以玩的演示。
那么f在每种情况下返回什么的规则是什么?
AKA - 对指针的这种迷恋是什么?
只使用了ActionScript,Java和C#这样的现代面向对象语言,我并不真正理解指针的重要性以及它们的用途.我在这里错过了什么?
传递指针参数,在C++中传递值?因为我看到指针的任何更改都不会反映在方法之外.我通过解除引用指针所做的更改会被反映出来.
在这种情况下,使用指针指向函数的参数是否可以接受/标准过程来修改函数中的指针值?
我在google上寻找答案,但我并不满意.
我的逻辑:
Java 使用内存位置,它只是在你无法看到或访问它的幕后(据我所知,可能有访问它的方法,我不知道).
我的困惑/疑问:
没有指向Java等编程语言的指针的目的是什么,专门用于在任何系统上使用的互联网,而不是像c ++这样使用指针的编程语言?
编辑
你们中许多人都在说"保持简单".如果是这种情况,那么为什么流行的编程语言,比如c++使用指针呢?
我正在尝试实现一个指针数组,以便我可以遍历元素.但是我不确定如何正确地做到这一点:
TYPE(domain),POINTER :: d01,d02,d03
TYPE(domain),DIMENSION(:),POINTER :: dom
...
dom(1) => d01
dom(2) => d02
dom(3) => d03
...
Run Code Online (Sandbox Code Playgroud)
然后:
...
IF(ASSOCIATED(dom(2),d02))THEN
...
Run Code Online (Sandbox Code Playgroud)
编译器(x86-64 Linux -tp istanbul-64上的pgf90 10.6-0 64位目标)给出了以下错误消息:
PGF90-S-0074-Illegal number or type of arguments to associated - keyword argument pointer (test_ptr.f90: 10)
0 inform, 0 warnings, 1 severes, 0 fatal for MAIN
Run Code Online (Sandbox Code Playgroud)
据我所知,如何对指针数组进行子集化是有问题的.两个dom(2)和d02是秩0(标量指针).实现这个的正确方法是什么?
谢谢.
以下函数无法编译:
std::unique_ptr<int> foo()
{
int* answer = new int(42);
return answer;
}
std::unique_ptr<int> bar()
{
return new int(42);
}
Run Code Online (Sandbox Code Playgroud)
我觉得这有点不方便.std::unique_ptr<T>(T*)明确的理由是什么?
我正在尝试使用C指针文献.在其中一个插图中,我遇到了以下代码.
# include <stdio.h>
int main()
{
static int a[]={0,1,2,3,4};
static int *p[]={a, a+1, a+2, a+3, a+4};
int **ptr;
ptr =p;
**ptr++;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
*++*ptr;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
++**ptr;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到输出为.
1 1 1
1 2 2
1 2 3
Run Code Online (Sandbox Code Playgroud)
我在为这个输出辩护时遇到了问题.我在副本上制作了很多盒子,以便轻松掌握问题.我能够证明输出的合理性1 1 1,我的麻烦始于声明,*++*ptr.
因为,一元运算符从右到左执行.因此,*ptr将首先处理,然后ptr将增加值.在这个增量之后,我不确定会发生什么,书中说不知何故p也会增加指向此数组中的下一个元素.输出1 2 2只能通过增量来实现p.
我不确定这种问题是否恰好适合stackoverflow.
我尽我所能,浪费了至少10页,上面画着盒子.
任何澄清将不胜感激.
我在@jsantander评论中链接到的论坛帖子中读到了这个说法:
请记住,当您将指针指定或比较为零时,会在幕后发生一些特殊的魔法,以便为给定指针使用正确的模式(实际上可能不为零).这就是为什么之类的东西的原因之一
#define NULL (void*)0是邪恶的-如果比较char*到NULL那个魔法已明确(可能不知不觉)关闭,无效结果可能发生.只是为了清楚:Run Code Online (Sandbox Code Playgroud)(my_char_ptr == 0) != (my_char_ptr == (void*)0)
所以我理解它的方式,对于一个架构,其中NULL指针,比如0xffff代码if (ptr),将比较ptr 0xffff而不是0.
这是真的吗?它是用C++标准描述的吗?
如果为true,则意味着即使对于具有非零NULL指针值的体系结构,也可以安全地使用0.
编辑
作为额外的澄清,请考虑以下代码:
char *ptr;
memset(&ptr, 0, sizeof(ptr));
if ((ptr == (void*)0) && (ptr != 0)) {
printf("It can happen.\n");
}
Run Code Online (Sandbox Code Playgroud)
这就是我理解这个论坛帖子的主张.