面试题答案
一键面试-
修改函数定义:
- 原函数定义为
void modifyData(int* data)
,为了既能接收普通指针又能接收指向常变量的指针,可将函数定义修改为void modifyData(const int* data)
。这样函数可以接受const int*
类型的指针,同时也能隐式转换接受int*
类型的指针(因为int*
可以转换为const int*
)。
- 原函数定义为
-
函数内部改变:
- 由于参数现在是
const int*
,在函数内部不能直接修改*data
。如果需要修改数据,一种常见的办法是先将数据复制到一个非const
的变量中,然后对这个非const
变量进行修改。例如:
void modifyData(const int* data) { int temp = *data; // 对temp进行修改 temp = temp + 1; // 这里如果要反馈修改后的值给调用者,可能需要其他机制,比如通过返回值或额外的非const指针参数 }
- 由于参数现在是
-
常指针可能引发的问题及解决办法:
- 问题:
- 如果函数试图直接修改
const int*
指针指向的数据,会导致编译错误,因为const
修饰的指针指向的数据是不可变的。例如,在void modifyData(const int* data)
函数内写*data = 5;
会编译失败。 - 另外,如果函数需要将修改后的数据反馈给调用者,由于指针指向的是
const
数据,不能直接在原数据上修改,这可能需要额外的处理。
- 如果函数试图直接修改
- 解决办法:
- 对于不能直接修改
const
数据的问题,如前面所述,可以先将数据复制到非const
变量进行修改。 - 对于反馈修改后数据给调用者的问题,一种办法是通过函数返回值返回修改后的数据,例如:
int modifyData(const int* data) { int temp = *data; temp = temp + 1; return temp; }
- 另一种办法是提供一个额外的非
const
指针参数用于存储修改后的数据:
void modifyData(const int* data, int* result) { int temp = *data; temp = temp + 1; *result = temp; }
- 对于不能直接修改
- 问题: