在指针上设置指针的函数

Function setting up pointer on pointer

为什么这能正常工作:

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,为什么?

fun(tab2) 本质上是一个 no-op,因为该函数所做的只是更改按值传递的输入参数 x 的值:它确实 not 在调用者中更改 tab2 的值。

您使用 new 的事实是转移注意力。不要忘记在 new[].

返回的指针上调用 delete[]

void fun(unsigned char* x)

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

这个函数

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 的值将被更改。