第7章间接访问—指针内容摘要:

mp。 x1, amp。 x2)  函数的参数有两类:输入参数和输出参数。 一般,输入参数用值传递,输出参数用指针传递。 在参数表中,输入参数放在前面,输出参数放在后面。 《 程序设计 》 程序设计 49 原型的改进  并不是每个一元二次方程都有两个不同根,有的可能有两个等根,有的可能没有根。 函数的调用者如何知道 x1和 x2中包含的是否是有效的解。  解决方案:让函数返回一个整型数。 该整型数表示解的情况 《 程序设计 》 程序设计 50 完整的函数 int SolveQuadratic(double a,double b,double c, double *px1,double *px2) { double disc, sqrtDisc。 if(a == 0) return 3。 //不是一元二次方程 disc = b * b 4 * a * c。 if( disc 0 ) return 2。 //无根 if ( disc == 0 ) { *px1 = b /(2 * a)。 return 1。 } //等根 //两个不等根 sqrtDisc = sqrt(disc)。 *px1 = (b + sqrtDisc) / (2 * a)。 *px2 = (b sqrtDisc) / (2 * a)。 return 0。 } 《 程序设计 》 程序设计 51 函数的调用 int main() { double a,b,c,x1,x2。 int result。 cout 请输入 a,b,c:。 cin a b c。 result = SolveQuadratic(a, b, c, amp。 x1, amp。 x2)。 switch (result) { case 0: cout 方程有两个不同的根: x1 = x1 x2 = x2。 break。 case 1: cout 方程有两个等根: x1。 break。 case 2: cout 方程无根。 break。 case 3: cout 不是一元二次方程。 } return 0。 } 《 程序设计 》 程序设计 52 指针作为函数参数和返回值  指针作为函数参数  数组名作为函数参数  返回指针的函数  引用和引用传递  返回引用的函数 《 程序设计 》 程序设计 53 数组传递的进一步讨论  数组传递的本质是地址传递,因此形参和实参可以使用数组名,也可以使用指针。  数组传递是函数原型可写为: type fun(type a[], int size)。 也可写为 type fun(type *p, int size)。 但在函数内部, a和 p都能当作数组使用  调用时,对这两种形式都可用数组名或指针作为实参  建议:如果传递的是数组,用第一种形式;如果传递的是普通的指针,用第二种形式 《 程序设计 》 程序设计 54 include iostream using namespace std。 void f(int arr[], int k) {cout sizeof(arr) sizeof(k) endl。 } void main() { int a[10]={1,2,3,4,5,6,7,8,9,0}。 cout sizeof(a) endl。 f(a,10)。 } 输出: 40 4 4 C++将数组名作为参数传递处理成指针的传递 即在 main中, a是数组,占用了 40个字节。 而在函数 f中,arr是一个指针 《 程序设计 》 程序设计 55 数组传递的灵活性 void sort(int p[ ] , int n) {...} main() {int a[100]。 ... sort(a, 100)。 //排序整个数组 sort(a, 50)。 //排序数组的前 50个元素 sort(a+50, 50)。 //排序数组的后 50个元素 ... } 《 程序设计 》 程序设计 56 实例  设计一函数用分治法在一个整数数组中找出最大和最小值  具体方法是:  如果数组只有一个元素,则最大最小都是他。  如果数组中只有两个元素,则大的一个就是最大数,小的就是最小数。 这种情况不需要递归。  否则,将数组分成两半,递归找出前一半的最大最小值和后一半的最大最小值。 取两个最大值中的较大者作为最大值,两个最小值中的较小值作为最小值。 《 程序设计 》 程序设计 57 设计考虑  函数的参数是要查找的数组,传递一个数组要两个参数:数组名和数组规模  函数返回的是数组中的最大值和最小值,将它们作为指针传递的参数  查找数组的前一半就是递归调用本函数,传给他的参数是当前的数组名,数组的规模是原来的一半  查找数组的后一半也是递归调用本函数,传给它的参数是数组后一半的起始地址,规模也是原来的一半 《 程序设计 》 程序设计 58 伪代码 void minmax ( int a[ ] , int n , int *min_ptr , int *max_ptr) { switch (n) { case 1: 最大最小都是 a[0]。 case 2: 大的得放入 *max_ptr,小的放入 *min_ptr; Default: 对数组 a的前一半和后一般分别调用 minmax; 取两个最大值中的较大者作为最大值; 取两个最小值中的较小值作为最小值 } } 《 程序设计 》 程序设计 59 void minmax ( int a[] , int n , int *min_ptr , int *max_ptr) { int min1 , max1 , min2 , max2。 switch(n) { case 1: *min_ptr = *max_ptr = a[0]。 return。 case 2: if (a[0] a[1] ) { *min_ptr = a[0]。 *max_ptr= a[1]。 } else { *min_ptr = a[1]。 *max_ptr= a[0]。 } return。 default: minmax( a, n/2, amp。 min1, amp。 max1 )。 minmax( a + n/2, n n / 2, amp。 min2, amp。 max2 )。 if (min1 min2) *min_ptr = min1。 else *min_ptr = min2。 if (max1 max2) *max_ptr = max2。 else *max_ptr = max1。 return。 } } 《 程序设计 》 程序设计 60 指针作为函数参数和返回值  指针作为函数参数  数组名作为函数参数  返回指针的函数  引用和引用传递  返回引用的函数 《 程序设计 》 程序设计 61 返回指针的函数  函数的返回值可以是一个指针  返回指针的函数原型: 类型 *函数名(形式参数表);  当函数的返回值是指针时,返回地址对应的变量不能是局部变量。 《 程序设计 》 程序设计 62 实例  设计一个函数从一个字符串中取出一个子串。  原型设计:  从哪一个字符串中取子串、起点和终点  返回值:字符串可以用一个指向字符的指针表示,所以函数的执行结果是一个字符串,表示一个字符串可以用一个指向字符的指针  返回值指针指向的空间必须在返回后还存在。 这可以用动态字符数组 《 程序设计 》 程序设计 63 char *subString(char *s, int start, int end) { int len = strlen(s)。 if (start 0 || start = len || end 0 || end = len || start end) { cout 起始或终止位置错 endl。 return NULL。 } char *sub = new char[end start + 2]。 strncpy(sub, s + start, end start +1)。 sub[end start +1] = 39。 \039。 return sub。 } 《 程序设计 》 程序设计 64 指针作为函数参数和返回值  指针作为函数参数  数组名作为函数参数  返回指针的函数  引用和引用传递  返回引用的函数 《 程序设计 》 程序设计 65 引用传递  引用传递是地址传递的另一种更简单明了的实现方法 引用的概念 函数中的引用 《 程序设计 》 程序设计 66 C++中的引用  引用的定义:给一个变量取一个别名 ,使一个内存单元可以通过不同的变量名来访问。 例: int i。 int amp。 j=i。 j是 i的别名, i与 j是同一个内存单元。  C++引入引用的主要目的是将引用作为函数的参数。 《 程序设计 》 程序设计 67 引用传递  引用传递是地址传递的另一种更简单明了的实现方法 引用的概念 函数中的引用 《 程序设计 》 程序设计 68 引用参数  C++引入引用的主要目的是将引用作为函数的参数。 指针参数 void swap(int *m, int *n) { int temp。 temp=*m。 *m=*n。 *n=temp。 } 调用: swap(amp。 x, amp。 y) 引用参数 void swap(int amp。 m, int amp。 n) {int temp。 temp。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。