我问这是因为我的程序有两个函数来乘以matrix,他们只乘以4×4和4x1matrix。 标题是: double** mult4x1(double **m1, double **m2); double** mult4x4(double **m1, double **m2); 他们做m1 * m2并返回一个**双,下面是一个4×4乘法片段。 double** mult4x4(double **m1, double **m2){ double** result = (double**) malloc(sizeof(double)*4); for (int i = 0; i < 4; i++) { result[i] = (double*) malloc(sizeof(double)*4); } …multiply… return result; } mult4x1和mult4x4之间的区别仅在它们内部使用的索引中。 我有这3个matrix: double m1[4][4] = { {2, 3, 5, 6}, {9, […]
可能重复: 指针variables和引用variables在C ++中有什么区别? 在C ++中通过引用传递指针是否有好处? 在这两种情况下,我都达到了这个结果。 那么什么时候比其他人更喜欢? 我们之间使用的理由是什么? #include <iostream> using namespace std; void swap(int* x, int* y) { int z = *x; *x=*y; *y=z; } void swap(int& x, int& y) { int z = x; x=y; y=z; } int main() { int a = 45; int b = 35; cout<<"Before Swap\n"; cout<<"a="<<a<<" b="<<b<<"\n"; swap(&a,&b); […]
我和其他许多人使用智能指针在C ++中使用诸如RAII等这样的东西来包装不安全的内存操作,取得了巨大的成功。 但是,如果有析构函数,类,操作符重载等,则包装内存pipe理更容易实现。 对于使用原始C99编写的程序,您可以在哪里指出(无意双关)来帮助安全的内存pipe理? 谢谢。
关于==和!=运算符的C标准的 6.5.9节陈述如下: 2以下情况之一应为: 两个操作数都有算术types; 两个操作数都是指向兼容types的合格版本或非限定版本的指针; 一个操作数是一个指向对象types的指针,另一个是指向合格或不合格版本的void的指针; 要么 一个操作数是一个指针,另一个是一个空指针常量。 … 6 两个指针比较相等当且仅当两者都是空指针,都是指向同一个对象的指针(包括一个指向一个对象和一个子对象的指针)或者函数,都指向一个指向同一个对象的最后一个元素数组对象,或者一个指针指向一个数组对象的末尾,另一个指向不同数组对象的起始位置,该指针恰好紧跟地址空间中的第一个数组对象。 109) 7对于这些运算符而言, 指向不是数组元素的对象的指针的行为与指向长度为1的数组的第一个元素的指针相同,该对象的types是元素types。 脚注109: 109) 两个对象可能在内存中相邻,因为它们是大型数组中相邻的元素或结构的相邻成员之间没有填充,或者因为实现select将它们放置,即使它们不相关 。 如果之前的无效指针操作(如访问数组边界外)产生未定义的行为,后续比较也会产生未定义的行为。 这似乎表明您可以执行以下操作: int a; int b; printf("a precedes b: %d\n", (&a + 1) == &b); printf("b precedes a: %d\n", (&b + 1) == &a); 这应该是合法的,因为我们正在使用地址一个元素超过数组的末尾(在这种情况下是单个对象作为大小为1的数组对待),而不需要对其进行解引用。 更重要的是,如果一个variables紧跟在另一个variables的后面,那么这两个语句中的一个将被要求输出1 。 但是,testing似乎并没有解决这个问题。 鉴于以下testing程序: #include <stdio.h> struct s { int a; int […]
我已经使用了几年的指针,但是我最近才决定转换到C ++ 11的智能指针(即独特,共享和弱)。 我对它们做了一些相当的研究,这些是我绘制的结论: 独特的指针是伟大的。 他们pipe理自己的记忆,并像原始指针一样轻量级。 尽可能优先于原始指针的unique_ptr。 共享指针是复杂的。 由于引用计数,它们有很大的开销。 通过const引用传递它们,或者遗憾你的方法的错误。 他们不是邪恶的,但应该谨慎使用。 共享指针应该拥有自己的对象; 当不需要所有权时使用弱指针。 locking一个weak_ptr具有与shared_ptr拷贝构造函数相同的开销。 继续忽略auto_ptr的存在,现在已经废弃了。 所以,考虑到这些原则,我着手修改我的代码库,以利用我们新的shiny的智能指针,完全打算尽可能多地指明原始指针。 然而,我很困惑,关于如何最好地利用C ++ 11智能指针。 举个例子,假设我们正在devise一个简单的游戏。 我们决定将一个虚构的Texture数据types加载到一个TextureManager类中是最佳的。 这些纹理是复杂的,所以将它们按价值传递是不可行的。 此外,让我们假设游戏对象需要特定的纹理,取决于它们的对象types(即汽车,船等)。 在此之前,我会将纹理加载到一个向量(或者像unordered_map这样的其他容器)中,并在每个相应的游戏对象中存储指向这些纹理的指针,以便在需要渲染时可以引用它们。 我们假设纹理保证比他们的指针长。 那么我的问题就是如何在这种情况下最好地利用智能指针。 我看到几个选项: 将纹理直接存储在容器中,然后在每个游戏对象中构造一个unique_ptr。 class TextureManager { public: const Texture& texture(const std::string& key) const { return textures_.at(key); } private: std::unordered_map<std::string, Texture> textures_; }; class GameObject { public: void set_texture(const Texture& texture) […]
考虑下面的代码 (以及VirtualAlloc()返回一个void* )的事实: BYTE* pbNext = reinterpret_cast<BYTE*>( VirtualAlloc(NULL, cbAlloc, MEM_COMMIT, PAGE_READWRITE)); 为什么selectreinterpret_cast而不是static_cast ? 我曾经认为reinterpret_cast是好的例如铸造指针和整数types的指针(如DWORD_PTR ),但从一个void*转换为BYTE* ,是不是static_cast好吗? 在这种特殊情况下是否存在任何(微妙的)差异,还是仅仅是有效的指针转换? C ++标准是否对这种情况有偏好,build议一种方式而不是另一种?
我join了一个新的小组,编码准则(对我来说)似乎过时了。 但是只有在没有有效备份的情况下才能对抗机器,不会让我感觉到任何地方。 所以我现在转向SO,看看我们是否能够理性地推翻/反对(嘿,我可能在我的select上是错误的,所以争论的双方都会被赞赏)。 争论的准则是: 提示:使用指针而不是引用来返回参数。 void Func1( CFoo &Return ); // bad void Func2( CFoo *pReturn ); // good 理由: 在使用引用时,它看起来与值相同。 调用者可能会惊讶于在调用该函数之后其值已被更改。 被调用者可能会无意中修改该值,而不会影响调用者的价值。 通过使用指针,调用者和被调用者都清楚该值是可以改变的。 在代码审查中使用引用可能会造成误导。
你如何用C编程语言手动指定一个指针地址(例如指向内存地址0x28ff44 )?
这个问题在这里提到。 我的问题是: 如果一个指针variables具有相同的地址作为它的值,它真的指向自己? 例如 – 在下面的一段代码中,是一个指向它自己的指针? #include<stdio.h> int main(){ int* a; int b = (int)&a; a = b; printf("address of a = %d\n", &a); printf(" value of a = %d\n", a); } 如果a不是自己的指针,那么同样的问题又出现了: 指针可以指向自己吗? 另外,自我指点指针如何有用?
不std::unique_ptr::get一个unique_ptr在第一个地方的目的? 我会期望这个函数改变它的状态,所以它不再有指针。 是否有一个std :: unique_ptr :: get的实际有用的使用?