函数在指针上设置指针

时间:2017-01-13 16:00:10

标签: c++ pointers assign

为什么这样做正常:

unsigned char* tab1;

int main()
{
   unsigned char* tab2;
   tab1 = new unsigned char[5];
   for(unsigned char i=0; i<5; i++){
       tab1[i] = i;
   }
   for(unsigned char x=0; x<5; x++){
       printf("%u\t",tab1[x]);
   }

   tab2 = tab1;

   for(unsigned char y=0; y<5; y++){
       printf("%u\t",tab2[y]);
   }
}

这不起作用:

unsigned char* tab1;

void fun(unsigned char* x){
    x = tab1;
}

int main()
{
   unsigned char* tab2;
   tab1 = new unsigned char[5];
   for(unsigned char i=0; i<5; i++){
       tab1[i] = i;
   }
   for(unsigned char x=0; x<5; x++){
       printf("%u\t",tab1[x]);
   }

   fun(tab2);

   for(unsigned char y=0; y<5; y++){
       printf("%u\t",tab2[y]);
   }
}

我不能按功能分配指针指针?如果我可以,怎么办?第一个版本给了我0 1 2 3 4,第二个1 0 0 0 0,为什么?

3 个答案:

答案 0 :(得分:1)

fun(tab2)本质上是一个无操作,因为所有函数正在做的是更改通过值传递的输入参数x的值:它更改调用者中tab2的值。

您使用new这一事实是一个红鲱鱼。不要忘记在delete[]返回的指针上调用new[]

答案 1 :(得分:1)

void fun(unsigned char* x)

您正在按值传递指针。当x被修改时,它是堆栈上的本地副本,而不是tab2。为此,您需要通过引用传递指针,如void fun(unsigned char*& x)

答案 2 :(得分:0)

此功能

void fun(unsigned char* x){
    x = tab1;
}

及其电话

unsigned char* tab2;
//...
fun(tab2);

可以通过以下方式想象

void fun( /* unsigned char* x */ ){
    unsigned char *inx = tab2;
    inx = tab1;
}

首先,局部变量inx获取指针tab2的值,然后其值被指针tab1的值覆盖。 tab2tab1本身都没有改变。 tab2在函数调用之前具有不确定的值,并且在函数调用之后具有相同的值。它是已更改的局部变量inx

函数参数是函数局部变量。他们获得相应参数值的副本。

如果要更改函数中的原始对象,则应通过引用将其传递给函数,相应地,必须将参数声明为具有指向参数类型的指针的类型。

那就是你可以用以下方式定义函数

void fun(unsigned char ** x){
    *x = tab1;
}

并将其称为

fun( &tab2 );

或以下方式

void fun(unsigned char * &x){
    x = tab1;
}

并将其称为

fun( tab2 );

在这种情况下,原始指针tab2的值将被更改。