对于在函数里利用指针进行交换已经不陌生了,这里有一个错例。
void swap(int *ptr1,int *ptr2)
{
int*temp;
temp=ptr1;//这里 temp和ptr1指向了同一个地址
*ptr1=*ptr2;
*ptr2=*temp;
}
这里的错误原因是,首先 temp指向了ptr1也在指向的那个地址,也就是temp和ptr1指向了同一个地址,暂且记为a的地址&a,a的值为10,ptr2指向b的地址&b,b的值为20,而
*ptr1=*ptr2;只是修改了a所在空间,即把a的值改变了,没有改变ptr1的指向,此时a由原来的10变为20,然而temp所指向的地址仍然为a改变前的地址,而此时找不到了,所以会运行出错,也可以说此时a,b都是20.
这个程序应该这么修改:(这样才是改变指向)
<span style="font-size:18px;">void swap(int *ptr1,int *ptr2)
{
int*temp;
temp=ptr1;//这里 temp和ptr1指向了同一个地址
ptr1=ptr2;
ptr2=temp;
}</span>
---------------------------------------------------------美丽的分割线------------------------------------------------------------------------------------------------------------------------------------------------------------
数组作为参数传入函数中:
void fun(int b[ ],int size)//b[ ]不会分配空间,只是分配地址, [ ] 中的数字无效
函数要访问二维数组,至少设计三个参数:返回值类型 函数名 (int array[ ] [ 10 ],int tows, int columns)
二维数组作为形参与一维数组的区别:要给出数组名(首地址)和列号(即给出出第一个下表外其他所有下标)
二维数组如果作为函数参数使用(这个博文里写的非常详细http://blog.youkuaiyun.com/xinshen1860/article/details/20620227)
版权声明:本文为博主原创文章,未经博主允许不得转载。
如果我们需要编写一个处理二维数组的函数,那么这个函数原型应该如何声明呢?
首先,我们应该牢记:数组名被视为其地址,因此,相应的形参是一个指针。例如,假设有如下的代码:
- int data[3][4] = { {1, 2, 3, 4}, {5, 5, 7, 8}, {9, 10, 11, 12} }
- int total = sum(data, 3);
我们可以这样理解:data 是一个数组名,该数组有3个元素。而这3个元素本身都是又4个 int 组成的数组。因此 data 的类型是指向由4个int组成的数组的指针。
因此正确的 sum 原型如下:
- int sum( int (*arr) [4], int size);
- //其中的括号是必不可少的,因为下面的声明将声明一个由四个指向int的指针组成的数组,而不是一个指向由4个int组成的数组的指针。
- int *arr[4]; //声明了一个指针数组,这个数组包含4个int指针变量
- int (*arr)[4] //声明了一个指针变量,这个指针指向由4个int组成的数组
还有另外一种声明格式,含义与上述正确原型完全相同,但是可读性更强:
- int sum(int arr[][4], int size);
上述2个原型都指出,arr 是指针而不是数组。还需要注意的是:int arr [ ] [4] 的含义就是: arr 是指向由4个 int 构成的数组的指针。因此,指针类型指定了列数,也就是说:函数形参已经确定了实参数组的列数,这就是为什么没有将列数作为独立的函数参数进行传递的原因。
void(printarray(int array[] [5],int fromrow,int torow,int fromcol,int tocol)
本文深入探讨了在C/C++中使用指针进行变量交换的常见错误及其修正方法,并详细解释了如何正确处理一维及二维数组作为函数参数的问题。
2416

被折叠的 条评论
为什么被折叠?



