指针

时间:2015-05-08 07:28:20

标签: c++ pointers pass-by-reference

在这段代码中,我试图将十进制数转换为二进制数。 (是的,我知道存在这样的功能 - 我试图重新发明轮子作为练习。)因为我使用函数toBinNum()来转换数字,我想通过引用传递一个空数组,然后将我的二进制数字存储在数组中,并在返回main()函数时,我将拥有数组binNum。这不会发生;我传递指针,初始化它并存储我的二进制数字,但是当我返回main()并尝试访问指针时,它失败,发出"Access violation on pointer"错误。我假设内存正在被释放,虽然我无法弄清楚为什么,因为指针的范围在main(),而new关键字在{{{当我在其中创建数组时。为什么这不起作用,我该如何解决?

toBinNum()

2 个答案:

答案 0 :(得分:3)

通过引用传递指针

cout << (long long int)(this) << endl;
cout << (long long int)((B *)this) << endl;

在C中你可以再使用一个间接

void toBinNum(int, int* &, int&);

函数声明的问题是任何未通过引用传递的参数(尽管引用也是函数的局部变量)是退出函数后销毁的函数的局部变量。局部变量的任何更改都不会影响原始参数。

您可以通过以下方式设想函数调用。让我们假设您有一个声明为

的函数
void toBinNum(int, int**, int*);

您可以通过以下方式调用

void f( int *p );

那么函数定义可以想象为

int main()
{
    int *q = nullptr;

    f( q );

    //...

如您所见,void f( /* int *p */ ) { int *p = q; p = new int; //... 参数未被更改。它是局部变量q,它获得了一个新值。

答案 1 :(得分:1)

我知道这个回复不是问题的正确答案(我在问题上面的评论中回答),但我认为这是一个很好的解决方案来转换二进制格式的数字。 但是,它会向您显示在不使用**&*的情况下在函数调用之外分配资源的想法

我使用下面的代码打印出整数的二进制转换。在这样的代码中,我使用函数iToBin()将整数转换为可以打印或使用任何你想要的字符数组。此函数还使用可选参数 - sym - 可用于指定要将哪些“符号”插入到数组中而不是符号“0”和“1”。函数iToBin()将高位编码到buff数组的第一个元素中,然后buff[0]是转换后的数字的高位。

#include<iostream>
#include<cstdlib>
#include<cmath>
#include<stdint.h>

using namespace std;

char * iToBin(uint64_t n, char *buff, int len, const char *sym=(const char []){'0','1'});

char * iToBin(uint64_t n,char *buff,int len, const char *sym)
{
    uint64_t k=1;
    *(buff+ --len)=0;

    do {
        *(buff+ --len)=(n&k)?sym[1]:sym[0];
        k<<=1;
    } while(k && len);

    return buff;
}

int main(void) {
    uint64_t value;
    int len=0;
    char * buff;

    buff=new char[sizeof(value)*8+1];
    if (buff==NULL) {
       cout << "Not enough memory" << endl;
       return 1;
    }

    do  {
        cout << "Insert the value to convert: ";
        cin >> value;

        //len=(log2(value)+1); //number of digit
        //len++; // to insert the string0 terminator
        //It's better to use this to compute the number of bits!
        len=64;
        while(!(value & (1ULL<<(len-1))) && len>1) len--;
        len++; //to insert string 0 terminator

        iToBin(value,buff,len);

        int numOnes=0;

        for(int i=0;i<len-1;i++) {
            if (buff[i]=='1') {
                numOnes++;
            }
        }

        cout << buff << " contains " << numOnes << " 1" << endl;        

    } while(value!=0);

    delete buff;

    return 0;
}

您也可以使用不同的符号来输出不同的信号,在下面的情况下,您将有一个输出,其中1位数字为“+”,0位数字为“ - ”。 (iToBin()可以直接用于打印输出结果,因为它返回数组指针值)

    char sym[2];
    sym[0]='-';sym[1]='+';

    cout << iToBin(value,buff,len,sym) << endl;

您可以使用下面的代码来获得一个代码,其中的位由0和1数字值表示:

sym[0]=0;sym[1]=1;

但是缓冲区结果将不会用作以C 0结尾的字符串!