为什么这样做正常:
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,为什么?
答案 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
的值覆盖。 tab2
和tab1
本身都没有改变。 tab2
在函数调用之前具有不确定的值,并且在函数调用之后具有相同的值。它是已更改的局部变量inx
。
函数参数是函数局部变量。他们获得相应参数值的副本。
如果要更改函数中的原始对象,则应通过引用将其传递给函数,相应地,必须将参数声明为具有指向参数类型的指针的类型。
那就是你可以用以下方式定义函数
void fun(unsigned char ** x){
*x = tab1;
}
并将其称为
fun( &tab2 );
或以下方式
void fun(unsigned char * &x){
x = tab1;
}
并将其称为
fun( tab2 );
在这种情况下,原始指针tab2
的值将被更改。