为什么C++需要和使用指针?我知道他们为语言增添了力量,但是对于初学者来说,这让他们更难理解.像F#,Java,Ruby,Python,Lua等语言在没有它们的情况下就可以了,并且它们非常强大.
我有一个指向10的整数数组的指针.取消引用这个指针应该给我什么?
例如:
#include<stdio.h>
main()
{
int var[10] = {1,2,3,4,5,6,7,8,9,10};
int (*ptr) [10] = &var;
printf("value = %u %u\n",*ptr,ptr); //both print 2359104. Shouldn't *ptr print 1?
}
Run Code Online (Sandbox Code Playgroud) 我想要一个std :: vector来包含一些函数,并且可以实时添加更多函数.所有函数都有这样的原型:
void name(SDL_Event*event);
我知道如何创建一个函数数组,但是如何创建一个std :: vector函数?我试过这个:
std::vector<( *)( SDL_Event *)> functions;
std::vector<( *f)( SDL_Event *)> functions;
std::vector<void> functions;
std::vector<void*> functions;
Run Code Online (Sandbox Code Playgroud)
但它们都没有奏效.请帮忙
我有一个任意值的数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int字符数组等).但是,我如何实际分配int给它?
以这些初始化为例:
void* data[10];
int x = 100;
Run Code Online (Sandbox Code Playgroud)
我的直觉会想到这一点,但这会产生编译错误:
data[0] = malloc(sizeof(int));
*(data[0]) = x;
Run Code Online (Sandbox Code Playgroud)
我也考虑过使用&x,但我会考虑一个局部变量的地址,这个(据我的理解)将在退出程序后被清除.所以,如果我有一个局部变量x,我如何正确地将它变为void指针类型的变量?
下午所有,
如果你愿意,请帮助一下.为了规避.NET中的2Gb对象限制,我创建了一个在堆上分配内存的类,这允许我创建最大可达RAM空间的数组.但是,为了便于开发(因为它是一个概念证明),它很难编写.现在它工作了我一直在尝试改变代码使用泛型,所以我可以使用相同的代码多种类型.
在分配内存并正确索引数组时,我需要一个与数组相同类型的指针数组,即需要长数组long*[] myLargeArray.问题是当我使用泛型这个声明变成时T*[] myLargeArray,它总是产生错误'不能取地址,获取大小,或者声明一个指向托管类型的指针('T')'
提前致谢.
PS在任何人问之前,是的,我确实需要这么大的阵列.
2D数组的代码示例:
LargeArray <int> myArray = new LargeArray<int>(x, y);
public unsafe class LargeArray where T : struct
{
...
private T*[] tArr;
...
public LargeArray(long sizeI, long sizeJ)
{
...
myLargeArray = new T*[sizeI];
...
}
}
Run Code Online (Sandbox Code Playgroud) 在C#中,可以声明一个具有指针类型成员的结构(或类),如下所示:
unsafe struct Node
{
public Node* NextNode;
}
Run Code Online (Sandbox Code Playgroud)
它是否安全(错误......忽略了那个具有讽刺意味的unsafe小旗......)使用这种结构?我的意思是在堆上长期存储.根据我的理解,GC可以自由移动,当它更新对已被移动的内容的引用时,它是否也更新了指针?我猜不是,这会使这种结构非常不安全,对吧?
我确信这样做有更好的选择,但称之为病态的好奇心.
编辑:似乎有些混乱.我知道这不是一个伟大的结构,我纯粹想知道这是否是一个安全的结构,即:指针保证指向你最初指向它的东西?
原始C代码用于遍历树(深度优先)而不递归,其中树存储在数组中.然后通过递增指针遍历数组,除非满足某个条件,然后将指针设置为NextNode,其中遍历继续.当然,在C#中也可以通过以下方式实现:
struct Node
{
public int NextNode;
... // other fields
}
Run Code Online (Sandbox Code Playgroud)
其中int是下一个节点的数组中的索引.但出于性能原因,我最终会摆弄指针和fixed数组以避免边界检查,而原始的C代码似乎更自然.
Haskell中是否存在指针质量的概念?==要求事物得到Eq,并且我有一些东西包含(值 - > IO值),而且 - >和IO都没有得到Eq.
编辑:我创建了这另一种语言翻译确实有指针相等,所以我想,同时仍然能够使用Haskell函数模型关闭模型此行为.
编辑:示例:我想要一个special能够执行此操作的函数:
> let x a = a * 2
> let y = x
> special x y
True
> let z a = a * 2
> special x z
False
Run Code Online (Sandbox Code Playgroud) 我正在尝试使指针指向2D数组指针.什么是语法以及如何访问元素?
我有一个这样的课:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
Inner* m_inner;
};
Run Code Online (Sandbox Code Playgroud)
在.cpp中,构造函数创建了一个Innerwith new和析构函数delete的实例.这工作得很好.
现在我想更改此代码以便使用,auto_ptr所以我写道:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
std::auto_ptr<Inner> m_inner;
};
Run Code Online (Sandbox Code Playgroud)
现在,构造函数初始化了auto_ptr,而析构函数什么都不做.
但它不起作用.当我实例化这个类时,问题似乎就出现了.我收到这个警告:
警告C4150:删除指向不完整类型'Inner'的指针; 没有破坏者叫
好吧,这显然非常糟糕,我明白为什么会发生这种情况,编译器不知道Inner实例化模板的时候auto_ptr<Inner>
所以我的问题:是否有一种方法可以使用auto_ptr前向声明,就像我在仅使用普通指针的版本中所做的那样?我
必须向#include每个班级宣布一个指针是一个巨大的麻烦,有时候,这是不可能的.这个问题通常是如何处理的?
例如,C#是否会以Endian敏感,代码如下:
int a = 1234567;
short b = *(short*)&i;
Run Code Online (Sandbox Code Playgroud)
始终为b分配相同的值.如果是这样,那将是什么价值?
如果没有,如果带有指针的代码,有什么好方法可以处理字节序?
pointers ×10
c++ ×4
c# ×3
c ×2
allocation ×1
auto-ptr ×1
comparison ×1
endianness ×1
equality ×1
function ×1
generics ×1
haskell ×1
shared-ptr ×1
stdvector ×1
unsafe ×1