int main(){
Employee *e = new Employee();
delete e;
delete e;
...
delete e;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 为什么解除引用称为解除引用?
我只是正确地学习指针,我想知道为什么要解除引用.它使我感到困惑,因为它听起来像是要删除引用,而不是通过指向目标的指针.
任何人都可以解释为什么它被称为这个?
对我来说像destination或pointed_to_value这样的东西会更有意义.
考虑:
int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;
Run Code Online (Sandbox Code Playgroud)
*如果它与一个立即使用&并且假设没有超载op&/ 在场,那么它是多么违法op*?
(这对解决过去的数组元素有一个特殊的影响&myArray[n],这个表达式明确相当于&*(myArray+n).这个Q&A解决了更广泛的情况,但我不觉得它真的满足了上面的问题.)
#include<stdio.h>
#include<stdlib.h>
int fun1()
{
printf("I am fun1.");
return 0;
}
int fun2(int fun())
{
fun();
return 0;
}
int main()
{
fun2(fun1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的程序可以运行.就我而言,我能理解int fun2(int (*fun)()),但我不知道它是如何int fun2(int fun())运作的.谢谢.
使用intptr_t作为通用存储(保存指针和整数值)而不是void*?(如下所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html)
对于我已经读过的内容:
int- > void*- > int往返不保证保持原值; 我猜int- > intptr_t- > int会的void*和intptr_t要求铸件,所以没有在这里得到好处void*表示存储指针时的显式转换次数较少,intptr_t表示存储整数值时转换次数较少intptr_t 需要C99我还应该考虑什么呢?
我在网上搜索,虽然我可以找到一些讨论,但我没有找到全面的描述.因此,如果任何人都可以形成一个涵盖指针大小的答案,那将会有很大的帮助.答案至少应包括以下主题
我知道可以分开创建一个指向成员函数的指针
struct K { void func() {} };
typedef void FuncType();
typedef FuncType K::* MemFuncType;
MemFuncType pF = &K::func;
Run Code Online (Sandbox Code Playgroud)
是否有类似的方法来构造指向const函数的指针?我尝试在各个地方添加const但没有成功.我已经玩了一些gcc,如果你做类似的模板演绎
template <typename Sig, typename Klass>
void deduce(Sig Klass::*);
Run Code Online (Sandbox Code Playgroud)
它会将Sig作为函数签名显示,并在最后添加const.如果要在代码中执行此操作,则会抱怨您无法在函数类型上使用限定符.看起来它应该是可能的,因为演绎有效.
有什么区别
int * num = new (int);
Run Code Online (Sandbox Code Playgroud)
和
int * num = new int;
Run Code Online (Sandbox Code Playgroud)
?
有什么不同吗?
编辑 thx all.......哪一个是最正确的答案?
动机:
几乎是为了好玩,我试图编写一个函数重载,可以分辨参数是固定大小的数组还是指针.
double const d[] = {1.,2.,3.};
double a;
double const* p = &a;
f(d); // call array version
f(p); // call pointer version
Run Code Online (Sandbox Code Playgroud)
我发现这特别困难,因为众所周知的事实是数组比指针更快地衰减到指针.一种天真的方法就是写作
void f(double const* c){...}
template<size_t N> void f(double const(&a)[N]){...}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.因为在最好的情况下,编译器确定f(d)上面的数组调用是不明确的.
部分解决方案:
我尝试了很多东西,我能得到的最接近的是以下具体代码.另请注意,在此示例代码中我使用的是char代替double,但最后它非常相似.
首先,我必须使用SFINAE来禁用函数指针版本中的转换(从数组ref到ptr).其次,我不得不为所有可能的数组大小(手动)重载.
[可编码]
#include<type_traits> // for enable_if (use boost enable_if in C++98)
#include<iostream>
template<class Char, typename = typename std::enable_if<std::is_same<Char, char>::value>::type>
void f(Char const* dptr){std::cout << "ptr" << std::endl;} // preferred it seems
void f(char const (&darr)[0] ){std::cout << …Run Code Online (Sandbox Code Playgroud) 在K&R第6章中,声明如下:
struct{
int len;
char *str;
} *p;
Run Code Online (Sandbox Code Playgroud)
我无法理解这个指针p指向哪个结构,如果这样的指针定义甚至是有效的,因为在书中给出的所有其他示例和我看到的其他示例中,在定义指向结构的指针时,名称需要提及结构,即定义的类型.例如,
struct example{
int a;
...
}s1;
Run Code Online (Sandbox Code Playgroud)
然后,
struct example *ptr = &s1;
Run Code Online (Sandbox Code Playgroud)
所以,提到ptr指向一个类型结构示例而不仅仅是struct.
此外,特别感兴趣的是:
*p-> str获取任何str点;*p-> str ++在访问它指向的任何内容后递增str(就像*s ++);
我无法首先遵循p是什么,因此,也不是增量和解除引用.
这里发生了什么?
提前致谢!
PS我是新来的,所以对这个问题的格式的任何反馈也将不胜感激.
pointers ×10
c++ ×8
c ×5
dereference ×2
function ×2
32bit-64bit ×1
allocation ×1
arrays ×1
c++11 ×1
dealloc ×1
intptr ×1
member ×1
memory ×1
structure ×1
terminology ×1