标签: pass-by-pointer

使用pass-by-reference而不是pass-by-pointer时的二进制兼容性

这个问题是作为这个问题的后续问题:C++中指针变量和引用变量之间有什么区别?

阅读了我在stackoverflow上找到的答案和一些进一步的讨论后,我知道编译器应该像处理pass-by-pointer一样对待pass-by-reference,而引用只不过是语法糖.考虑到二进制兼容性,如果存在任何差异,我还无法弄清楚一件事.

在我们的(多平台)框架中,我们要求在发布和调试版本之间(以及框架的不同版本之间)进行二进制兼容.特别是,我们在调试模式下构建的二进制文件必须可用于发布版本,反之亦然.为此,我们只在接口中使用纯抽象类和POD.

请考虑以下代码:

class IMediaSerializable
{
public:
    virtual tResult Serialize(int flags,
                              ISerializer* pSerializer,
                              IException** __exception_ptr) = 0;
//[…]
};
Run Code Online (Sandbox Code Playgroud)

ISerializer并且IException也是纯粹的抽象类.ISerializer必须指向现有对象,因此我们总是必须执行NULL指针检查.IException实现某种异常处理,其中指针指向的地址必须改变.出于这个原因,我们使用指向指针的指针,指针也必须是NULL指针.

为了使代码更清晰并省去一些不必要的运行时检查,我们希望使用pass-by-reference重写此代码.

class IMediaSerializable
{
public:
    virtual tResult Serialize(int flags,
                              ISerializer& pSerializer,
                              IException*& __exception_ptr) = 0;
//[…]
};
Run Code Online (Sandbox Code Playgroud)

这似乎没有任何缺陷.但问题仍然是我们是否仍然满足二进制兼容性的要求.

更新: 澄清事情:这个问题不是关于代码的pass-by-pointer版本和pass-by-reference版本之间的二进制兼容性.我知道这不能是二进制兼容的.事实上,我们有机会重新设计我们的API,我们考虑使用pass-by-reference而不是pass-by-pointer而不关心二进制兼容性(新的主要版本).问题只是关于仅使用代码的pass-by-reference版本的二进制兼容性.

c++ interface-design pass-by-reference binary-compatibility pass-by-pointer

4
推荐指数
1
解决办法
513
查看次数

将指针传递给在c ++中动态定义的内置类型

我想调用一个库的函数(我无法修改)

void function(int* i, char* c);
Run Code Online (Sandbox Code Playgroud)

有没有办法调用函数定义int和动态char

即做某事

function(&1, &'v');
Run Code Online (Sandbox Code Playgroud)

代替

int int_1 = 1;
char char_1 = 'v';
function(&int_1, &char_v);
Run Code Online (Sandbox Code Playgroud)

这将极大地减少我的代码长度,同时提高可读性.

c++ pass-by-pointer

4
推荐指数
1
解决办法
211
查看次数

Ruby 中如何通过引用传递?

目前,我正在 Ruby 中开发一个Watcher类,除其他外,它能够找到切换信号的周期持续时间。这通常相当简单,但我面临的一个问题是 Ruby 显然按值传递所有参数。在网上研究时,我发现了许多关于“按值传递”和“按引用传递”实际上是什么的不同讨论,但没有实际的“如何”。对于具有 C/C++ 背景的我来说,这是编程/脚本语言的重要组成部分。

我编写的课程的相关部分如下所示。Watcher::watchToggling() 方法是我遇到问题的方法。作为参数,aVariable应该是对我正在测量周期持续时间的值的引用。

class Watcher
  @done
  @timePeriod

  def reset()
    @done = false;
    @timePeriod = nil;
  end

  def watchToggling(aVariable, aTimeout=nil)
    oldState = aVariable;
    oldTime = 0;
    newTime = 0;

    timeout(aTimeout)do
      while(!@done)
        newState = aVariable;
        if(newState != oldState)
          if(newState == 1)
            # rising edge
            if(oldTime != 0)
              # there was already a rising edge before,
              # so we can calculate the period
              newTime = Time.now();
              @timePeriod = newTime - oldTime;
              @done = …
Run Code Online (Sandbox Code Playgroud)

ruby parameter-passing pass-by-reference pass-by-value pass-by-pointer

4
推荐指数
1
解决办法
4624
查看次数

Go中的"值语义"和"指针语义"是什么意思?

Go中的值语义指针语义是什么意思?在本课程中,作者在解释数组和切片的内部时,曾经多次提及上述术语,我完全无法理解.

pass-by-value go data-structures pass-by-pointer

4
推荐指数
1
解决办法
569
查看次数

在函数调用中被单指针和双指针参数混淆

我试图更深入地理解C函数中的指针参数.我编写了一个测试程序,试图看到将单个指针传递给一个函数的双指针然后修改它之间的区别.

我有一个有两个功能的程序.第一个函数modifyMe1将单个指针作为参数,并将a属性更改为7.第二个函数modifyMe2将双指针作为参数,并将a属性更改为7.

我期望第一个函数modifyMe1是"按值传递",即如果我传入了我的结构指针,C将创建它指向的数据的副本.对于后者,我正在做一个"传递引用",它应该修改结构.

但是,当我测试这个程序时,两个函数似乎都修改了结构.我知道对于指针的性质我有一个误解是肯定的.有人可以帮我解决这个问题吗?

谢谢!

这是我有的:

#include <stdio.h>
#include <stdlib.h>

struct myStructure {
    int a;
    int b;
};

void modifyMe1(struct myStructure *param1) {
    param1->a = 7;
}

void modifyMe2(struct myStructure **param1) {
    (*param1)->a = 7;
}

int main(int argc, char *argv[]) {
    struct myStructure *test1;

    test1 = malloc(sizeof(test1));
    test1->a = 5;
    test1->b = 6;

    modifyMe1(test1);

    printf("a: %d, b: %d\n", test1->a, test1->b);

    // set it back to 5
    test1->a = 5;
    printf("reset. a: %d, b: …
Run Code Online (Sandbox Code Playgroud)

c pointers pass-by-value pass-by-pointer

3
推荐指数
2
解决办法
7107
查看次数

C++通过引用调用

如果我有一个函数,它接受一个整数的指针,并且我从我的main传递一个整数变量的引用,这是按值调用还是通过引用调用?示例代码:

#include <iostream>

using namespace std;

void fun(int *a){
//Code block
}

int main(){
    int a = 5;
    fun(&a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码,是起作用的呼叫乐趣通过值的呼叫或通过引用调用?

c++ function pass-by-reference pass-by-value pass-by-pointer

3
推荐指数
1
解决办法
9218
查看次数

在Common Lisp中通过引用(而不是值)传递子数组

让我们假设我有一个数组 - 我将调用*my-array*- 看起来像这样:

#2A((1 2 3)
    (4 5 6)
    (7 8 9))
Run Code Online (Sandbox Code Playgroud)

我希望在子阵列上应用一些函数f

#2A((5 6)
    (8 9))
Run Code Online (Sandbox Code Playgroud)

我很乐意写作

(f (subarray *my-array* '(1 2) '(1 2))
Run Code Online (Sandbox Code Playgroud)

这里subarray需要作为参数:

  • 原始数组
  • 一个2元素的列表,在第一维上有起点和终点
  • 另一个2元素列表,第二维上有起点和终点
  • 等等

我正在寻找一些方法来通过f 引用(或通过指针?)而不是通过值将子数组作为参数传递给函数.

(解决这个问题的愚蠢方法是编写一个函数,在这个特定的情况下创建一个2*2数组并循环i和j复制原始数组中的值.但是,如果你处理相对较大的数组,这个会很贵.)

我发现存在一个cl-slice包但我不知道它是通过引用复制值还是访问数据.

arrays common-lisp pass-by-reference multidimensional-array pass-by-pointer

3
推荐指数
1
解决办法
433
查看次数

引用和指针的含义在一起?

在我的项目中,有一个像这样的函数调用的定义.

    int32 Map(void * &pMemoryPointer)
Run Code Online (Sandbox Code Playgroud)

在调用的地方,传递的参数是无效*,为什么我们只能将它作为指针本身接收,而不是这个?

c++ pass-by-reference pass-by-pointer

2
推荐指数
1
解决办法
121
查看次数

D是否通过复制传递价值?

如果我做:

myclass a = new myclass();
myclass b = a;
Run Code Online (Sandbox Code Playgroud)

是否b分或者是副本a

d pass-by-value pass-by-pointer

2
推荐指数
1
解决办法
80
查看次数

将结构从main()传递给worker函数时的Segfault

我正在尝试用C编写一个简单的游戏,我得到了一个SEGFAULT,并且不知道为什么!

这是该程序的代码:

#include <stdio.h>
#include <string.h>

#define MAX_PLYS_PER_GAME (1024)
#define MAX_LEN (100)

typedef struct {
   char positionHistory[MAX_PLYS_PER_GAME][MAX_LEN];
} Game;

void getInitialGame(Game * game) {
    memset(game->positionHistory, 0, MAX_PLYS_PER_GAME*MAX_LEN*sizeof(char));
}

void printGame(Game game) {
    printf("Game -> %p (%d)\n", &game, sizeof(game));
    fflush(stdout);
}

int hasGameEnded(Game game) {
    printGame(game);
    return 0;
}

int main(int argc, char *argv[]) {
    Game game;
    getInitialGame(&game);

    if (hasGameEnded(game))
        return -1;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试用gdb调试,但结果并没有让我太过分:

C:\Users\test>gdb test.exe
GNU gdb 5.1.1 (mingw experimental)
<snip>
This GDB was configured as "mingw32"...
(gdb) …
Run Code Online (Sandbox Code Playgroud)

c struct pass-by-value segmentation-fault pass-by-pointer

2
推荐指数
1
解决办法
161
查看次数