理解指针与传参的例子
举个小问题说明指针与传参:
- 编写函数reverse_string,它的原型如下:
void reverse_string(char *string);
函数把参数字符串中的字符反向排列。请使用指针而不是数组下标,不要使用任何C函数库中用于操纵字符串的函数。提示不需要声明一个局部数组来临时存储参数字符串。
分析一下几个问题:
- 参数传递会不会在函数内部改变,改变的是什么。---参数传递
- 如何进行反向排序操作。---指针
void reverse_string(char * string);
int main()
{
char cName[] = "Pointer";
cout << "Org: " << cName << endl;
reverse_string(cName);
cout <<"New: "<< cName << endl;
return 0;
}
void reverse_string(char * string)
{
char *pEnd = string;
while (*pEnd != '\0')
{
pEnd++;
}
char temp;
for (string, pEnd--; string < pEnd; string++, pEnd--)
{
temp = *string;
*string = *pEnd;
*pEnd = temp;
}
}
程序可以正常运行,运行结果如下:
由此,重新分析一下两个问题:
- 参数问题:
即便传递的是指针,依旧是变量,对于变量来说,传值操作在函数内部只是一份拷贝,所以指针string即便在移动,移动的是拷贝,并不是本身,所以最后输出*string(cName)的时候依旧是从头开始的。对于函数内部改变的是变量指针所指向地址存的值。其实传变量还是传引用才是最关键的区别点,只不过对于指针,要注意的是地址存值,对于其他变量,注意的是函数内部变量的地址进行的处理。
- 反向排序:
对于指针来说每次移动(加1)会移动变量类型大小(以字节为单位)乘移动距离,如整型int,虽然占4个字节1个字。指向的往往是首字节位置。
在反向排序的逻辑中,要首先取到尾字节位置,然后与首字节同时向中间移动直到相遇,同时交换存的值即可。