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