- 博客(85)
- 收藏
- 关注
原创 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走1秒,满60秒进1分钟,此时秒又从0起算,要求输出分和秒的值,用重载的运算符“<<“输出复数
而执行(cout<<c3)得到的结果就是具有新内容的流对象cout,因此,(cout<<c3)<<c2相当于cout(新值)<<c2。"<<"的右面是c3,它是Complex类对象。程序中重载了运算符"<<",运算符重载函数" operator<<"中的形参output是ostream类对象的引用,形参名output是用户任意起的。有下画线的是调用重载的流插入符,后面两个"<<"不是重载的流插入符,因为它的右侧不是Complex类对象而是标准类型的数据,是用预定义的流插入符处理的。
2024-08-27 23:45:26
312
原创 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走1秒,满60秒进1分钟,此时秒又从0起算,要求输出分和秒的值,对后置自增运算符重载
可以看到,重载后置自增运算符时,多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用,在定义函数时也不必使用此参数,因此可省略参数名,只须在括号中写int即可。编译系统在遇到重载后置自增运算符时,会自动调用此函数。请注意前置自增运算符"++"和后置自增运算符"++"二者作用的区别。前者是先自加,返回的是修改后的对象本身。后者返回的是自加前的对象,然后对象自加。请仔细分析后置自增运算符重载函数。
2024-08-26 22:00:25
208
原创 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走1秒,满60秒进1分钟,此时秒又从0起算,要求输出分和秒的值
但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。细心的读者可能会提出一个问题:"++"和"--"运算符有两种使用方式,针对"++"和"--"这一特点,C++约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。本题的要求是对Time类使用运算符++,时钟的特点是60秒为1分,当秒数自加到60时,就应使秒数为0,分数加1。自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢?
2024-07-12 12:10:07
715
原创 将运算符+重载为适用于复数加法,重载函数不作为成员函数,而放在类外,作为Complex类的友元函数
实际上,运算符重载函数应当有两个参数,但是,由于重载函数是Complex类中的成员函数,因此有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量,如表达式i+c2,运算符左侧的操作数i是整数,这时是无法利用前面定义的重载运算符的,因为无法调用i.operator+函数。可以将以上两个运算符重载函数都作为友元函数,也可以将一个运算符重载函数(运算符左侧为对象名的)作为成员函数,另一个(运算符左侧不是对象名的)作为友元函数。
2024-07-11 19:50:14
1088
原创 对运算符“+“实行重载,使之能用于两个复数相加
是根据表达式的上下文决定的,即根据运算符两侧(如果是单目运算符则为一侧)的数据类型决定的,如对3+5,则执行整数加法,对2.6+4.5,则执行双精度数加法,对两个复数对象,则执行复数加法。本来,C++提供的运算符只能用于C++的标准类型数据的运算,但C++程序设计的重要基础是类和对象,如果C++的运算符都无法用于类对象(对于类对象不能直接进行赋值运算、数值运算、关系运算、逻辑运算和输入输出操作),则类和对象的应用将会受到很大限制,影响了类和对象的使用。是关键字,是专门用于定义重载运算符的函数的,
2024-07-10 10:11:22
1277
原创 通过函数来实现复数相加
又如,"<<"是C++的位运算中的位移运算符(左移),但在输出操作中又是与流对象cout配合使用的流插入运算符,">>"也是位移运算符(右移),但在输入操作中又是与流对象cin配合使用的流提取运算符。例如,大家都已习惯于用加法运算符"+"对整数、单精度数和双精度数进行加法运算,如5+8,5.8+3.67等,其实,计算机处理整数、单精度数和双精度数加法的操作方法是不同的,由于C++已经对运算符"+"进行了重载,使"+"能适用于int,float,double类型的不同的运算。这就需要对运算符"+"进行重载。
2024-07-09 16:50:06
980
原创 声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数
在之前的文章中曾介绍了函数模板,对于功能相同而数据类型不同的一些函数,不必定义各个函数,可以定义一个可对任何类型变量进行操作的函数模板,在调用函数时,系统会根据实参的类型,取代函数模板中的类型参数,得到具体的函数。即在类模板名之后在尖括号内指定实际的类型名,在进行编译时,编译系统就用int取代类模板中的类型参数numtype,这样就把类模板具体化,或者说实例化了。Compare是类模板名,而不是一个具体的类,类模板体中的类型numtype并不是一个实际的类型,只是一个虚拟的类型,无法用它去定义对象。
2024-07-08 11:30:48
1413
原创 有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期和时间
所以在display函数中既可以输出Time类的时、分、秒,又可以输出其"朋友"类的对象中的年、月、日。注意,在输出本类对象的时、分、秒时,不必使用对象名,而在输出Date类的对象中的年、月、日时,就必须加上对象名(如d.month)。为了解决这个问题,C++允许对类进行"提前引用"的声明,即在正式声明一个类之前,先声明一个类名,表示此类将在稍后声明。在对一个类做了提前引用声明后,可以用该类的名字去定义指向该类型对象的指针变量或对象的引用(如在本例中,display的形参是Date类对象的引用)。
2024-07-07 22:25:53
991
原创 使用友元函数访问私有数据
如果在Time类的定义体中未声明display函数为friend函数,它是不能引用Time中的私有成员hour,minute,sec的(读者可以上机试一下:将上面程序中的第6行删去,观察编译时的信息)。如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在类体中用friend对其进行声明,此函数就称为本类的友元函数。例如,有一个人是两家人的邻居,被两家人都确认为好友,可以访问两家的各房间,但他在访问时理所当然地要指出他要访问的是哪家。
2024-07-06 12:41:08
604
原创 使用静态成员函数统计学生平均成绩
(2)在Student类中定义了两个静态数据成员sum(总分)和count(累计需要统计的学生人数),这是由于这两个数据成员的值是需要进行累加的,它们并不是只属于某一个对象元素,而是由各对象元素共享的,可以看出,它们的值是在不断变化的,而且无论对哪个对象元素而言,都是相同的,而且始终不释放内存空间。前面曾指出:当调用一个对象的成员函数(非静态成员函数)时,系统会把该对象的起始地址赋给成员函数的this指针。可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,而。
2024-07-05 14:31:01
881
原创 用立方体类Box定义两个对象,引用不同对象中的静态数据成员
(1)在第8章中我们曾强调:如果只声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分配空间。现在讨论的静态数据成员也是类似的,它不随对象的建立而分配空间,也不随对象的撤销而释放(一般数据成员是在对象建立时分配空间,在对象撤销时释放)。如果改变它的值,则在各对象中这个数据成员的值都同时改变了。但是也要注意公用静态数据成员与全局变量的不同,静态数据成员的作用城只限于定义该类的作用域内(如果是在一个函数中定义类,那么其中静态数据成员的作用城就是此函数内)。
2024-07-04 13:33:23
789
原创 将一个立方体对象的值赋给另一个立方体对象
本来,赋值运算符"="只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的(关于运算符的重载将在后面的文章中介绍)。对象赋值的一般形式为。数据成员是占存储空间的,不同对象的数据成员占有不同的存储空间,赋值的过程是将一个对象的数据成员在存储空间的状态复制给另一个对象的数据成员的存储空间。如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象。这里所指的对象的值是指对象中所有数据成员的值。
2024-07-03 12:56:11
520
原创 对象的引用和常引用
实际上,引用是一个指针常量,用来存放该变量的地址。如果形参为变量的引用,实参为变量名,则在调用函数进行虚实结合时,把实参变量的地址传给形参(引用),这样引用就指向实参变量。这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝。在看完后面的文章会知道,每次调用函数建立实参的拷贝时,都要调用复制构造函数,要有时间开销。如果不希望在函数中修改实参1的值,可以把fun函数的形参t声明为const(常引用),函数fun的首行为。注意,不是不能改变"引用t"的指向,而是t所指向的变量的值。
2024-07-02 13:30:07
541
原创 用不同的方法输出时间记录器的时、分、秒,注意对象指针的使用方法
第8行定义指向Time类公用成员函数的指针变量p3,第9行使p3指向Time类公用成员函数get_time,第10行调用对象t1中p3所指的成员函数,即t1.get_time(),输出t1中hour,minute和sec的值。在之前的文章中已介绍:成员函数不是存放在对象的空间中的,而是存放在对象外的空间中的。如果Time类的数据成员hour为公用的整型数据,则可以在类外通过指向对象数据成员的指针变量访问对象数据成员hour。定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。
2024-07-01 15:55:20
1076
原创 用对象数组的方法输出3个立方体的体积
如果构造函数有多个参数,则不能用在定义数组时直接提供所有实参的方法,因为一个数组有多个元素,对每个元素要提供多个实参,如果再考虑到构造函数有默认参数的情况,很容易造成实参与形参的对应关系不清晰,出现歧义性。Student(1001,18,87), //调用第1个元素的构造函数,向它提供3个实参。Student(1002,19,76), //调用第2个元素的构造函数,向它提供3个实参。//合法,3个实参分别传递给3个数组元素的构造函数。
2024-06-30 13:11:40
598
原创 编写一个包含构造函数和析构函数的C++程序
在main函数的前面声明类,它的作用域是全局的。接着建立对象stud2,在建立对象时调用stud2的构造函数,然后调用stud2的display函数,输出stud2的数据成员的值。至此,主函数中的语句已执行完华,对主函数的调用结束了,在主函数中建立的对象是局部的,它的生命期随着主函数的结束而结束,在撤销对象之前的最后一项工作是调用析构函数。(static)局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
2024-06-29 17:40:20
596
原创 有两个长方柱,求它们的体积。编写一个基于对象的程序,在类中用宽、高、长的默认值均为10的构造函数对数据成员初始化
可以看到,在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。因为类声明是放在头文件中的,它是类的对外接口,用户是可以看到的,而函数的定义是类的实现细节,用户往往是看不到的。在实际生活中常有一些这样的初始值:计数器的初始值一般默认为0,战士的性别一般默认为"男",天气默认为"晴"等,如果实际情况不是这些值,则由用户另行指定。Box box2(15,30) //是调用上面第1个构造函数,还是调用第3个构造函数。
2024-06-28 13:40:31
992
原创 有两个长方柱,其高、宽、长分别为12,20,25;10,14,20。求它们的体积。编写一个基于对象的程序,在类中定义两个构造函数对数据成员初始化,其中一个无参数,一个有参数
在主函数中,建立对象box1时没有给出参数,系统找到与之对应的无参构造函数Box,执行此构造函数的结果是使3个数据成员的值均为10,然后输出box1的体积。建立对象box2时给出3个实参,系统找到有3个形参的构造函数Box与之对应,执行此构造函数的结果是使3个数据成员的值为15,30,25,然后输出box2的体积。(3)尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。有了之前文章介绍的函数重载的知识很容易理解构造函数的重载。
2024-06-27 11:58:09
508
原创 有两个长方柱,其高、宽、长分别为12,20,25;10,14,20。求它们的体积。编写一个基于对象的程序,在类中用带参数的构造函数对数据成员初始化
这种方式使该类的每一个对象的数据成员都得到同一组初值(例中各个对象的数据成员的初值均为0)。但有时用户希望对不同的对象赋予不同的初值,这时就无法使用上面的办法来解决了。(2)定义不同对象时用的实参是不同的,它们反映不同对象的属性。(1)带参数的构造函数中的形参,其对应的实参是在建立对象时给定的,即在建立对象时同时指定数据成员的初值。,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现对不同对象的初始化。在建立对象时把实参的值传递给构造函数相应的形参,把它们作为数据成员的初值。
2024-06-26 10:55:59
655
原创 用构造函数为对象的数据成员实现输入和输出时间
请不要误认为是在声明类时直接对程序数据成员赋初值(那是不允许的),赋值语句是写在构造函数的函数体中的,只有在调用构造函数时才执行这些赋值语句,对当前对象中的数据成员赋值。在上面的程序中,在主函数中定义了一个对象t1,在此时,就会自动调用t1对象中的构造函数Time,使各数据成员的值为0。接着建立对象t2,同时对t2中的数据成员赋予初值0,但对t2的数据成员不再赋予新值,直接输出数据成员的初值。构造函数是在声明类的时候由类的设计者定义的,程序用户只须在定义对象的同时指定数据成员的初值即可。
2024-06-25 13:28:19
1027
原创 找出一个整型数组中的元素的最大值
但是,如果面对的是一个大型的、复杂的问题,例如学校中的数据处理,学校中有不同的人群(如教师、职工、学生),有不同的行政组织(如学院、系),学生有不同的层次(本科生、硕士生、博士生),也有不同的年级……如果想找出信息学院三年级学生中曾选修机械学院张教授和李教授课程的学生,这个不算复杂的问题,用面向过程的方法处理是很麻烦的,各种数据量大,容易混淆,程序设计者需要清晰地处理每一个步骤,先后调出所需的数据并对其进行不同的处理,难度很大。(3)对数据的访问一般是通过对象进行的,即指定访问的是哪个对象中的数据。
2024-06-24 13:14:17
718
原创 用含成员函数的类,分别输入和输出各对象中的时间(时:分:秒)
函数 t1.display()只能引用对象 t1中的数据成员,t2.display( )只能引用对象 t2 中的数据成员。尽管t1和t2都属于同一类,但t1的成员函数只能访问t1中的成员,而不能访问t2中的成员,反之亦然。定义成员函数时应该指定类名,因为定义的是该类中的成员函数,而调用成员函数时应该指定具体的对象名。在执行时,会根据this指针的指向,输出当前对象中的数据成员的值。
2024-06-23 11:11:05
553
原创 定义多个类对象,分别输入和输出各对象中的时间(时:分:秒)
在 C++中,声明是作为语句处理的,可以出现在程序中的任何行。时,将12,23,34分别传递给形参hour,minute和sec,然后再赋予t.hour,t.minute,t.sec,由于t是t1的引用,因此相当于赋给t1.hour, t1.minute,t1.sec,即对象t1中的数据成员hour,minute和sec。如果在定义函数时也指定默认参数,其值应与函数声明时一致,如果不一致,编译系统以函数声明时指定的默认参数值为准,在定义函数时指定的默认参数值不起作用。在之后的文章中,类体中就包含成员函数。
2024-06-22 11:59:04
725
原创 用类来实现输入和输出时间(时:分:秒)
(2)不要错写为类名,如写成Time.hour,Time.minute,Time.sec是不对的。因为类是一种抽象的数据类型,并不是一个实体,也不占存储空间,而对象是实际存在的实体,是占存储空间的,其数据成员是有值的,可以被引用的。类Time中只有数据成员,而且它们被定义为公用的,因此可以在类的外面对这些成员进行操作。t1被定义为Time类的对象。在主函数中向t1对象的数据成员输入用户指定的时、分、秒的值,然后输出这些值。(3)如果删掉主函数的3个输入语句,即不向这些数据成员赋值,则它们的值是不可预知的。
2024-06-21 17:21:09
503
原创 口袋中有红、黄、蓝、白、黑5种颜色的球若干。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况
在第1次循环时,pri的值为i,如果i的值为red,则输出字符串"red",表示我们心目中以枚举常量red代表"红色",以此类推。如果i和j同色则不可取,只有i,j不同色(i≠j)时才需要继续找第3个球,此时第3个球k也有5种可能(red到black),但要求第3个球不能与第1个球或第2个球同色,即k≠i,k≠j。但显然用枚举变量更直观,因为枚举元素都选用了令人"见名知意"的标识符,而且枚举变量的值限制在定义时规定的几个枚举元素范围内,如果赋予它一个其他值,就会出现出错信息,便于检查。workday=2;
2024-06-20 14:10:34
1241
原创 开辟一个存储空间以存放一个结构体数据
在main函数中并没有定义结构体变量,而是定义了一个基类型为Student的指针变量 p,用new开辟一段空间以存放一个Student类型的数据,空间的大小由系统根据Student自动算出,不必用户指定。可以对该空间中各成员赋值,并输出它们的值。float * p=new float(3.14159) 开辟一个存放单精度数的空间,并指定该数的初值为3.14159,将返回的该空间的地址赋给指针变量p。//开辟存放一个整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址。
2024-06-19 14:58:24
2206
原创 有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求在main函数中为各成员赋值,在另一函数print中将它们的值输出
用结构体变量作实参时,采取的是"值传递"的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。程序(3)的实参是结构体Student类型变量,而形参用Student类型的引用,虚实结合时传递的是stu的地址,因而效率较高。实参中全部内容通过值传递方式一一传给形参,如果结构体变量占的存储空间很大,则在虚实结合时空间和时间的开销都比较大,效率不高的。将stu的起始地址传给形参,而不是将结构体变量的各成员的值一一传给形参,因而空间和时间的开销都很小,效率较高。
2024-06-18 18:47:08
812
原创 定义一个结构体变量stu,成员包括学号、姓名、性别、成绩。定义一个指针变量p指向该结构体变量stu,通过该指针变量输出各成员的值
第2个cout语句用(*p)和成员运算符"."输出stu各成员的值,(*p)表示p指向的结构体变量,(*p).num是p指向的结构体变量中的成员num,即stu.num。注意*p两侧的括号不可省略,因为成员运算符"."优先于"*"运算符,*p.num就等价于*(p.num)了。p->num和(*p).num 等价。++p->n 得到p指向的结构体变量中的成员n的值,并使之加1,然后再使用它。p->n++ 得到p指向的结构体变量中的成员n的值,用完该值后使它加1。
2024-06-17 09:57:17
1479
4
原创 对候选人得票的统计程序
在10次循环中每次输入一张选票上的信息(一个被选人的姓名),然后把它与3个候选人姓名一一相比,看它和哪一个候选人的名字相同。注意leader_name是和leader[j].name相比,leader[j]是数组leader的第j个元素,它包含两个成员项,leader_name应该和leader数组第j个元素的name成员相比。在输入和统计结束之后,将3人的名字和得票数输出。程序定义一个全局的结构体数组leader,它有3个元素,每一元素包含两个成员name(姓名)和count(得票数)。
2024-06-16 18:59:01
828
原创 定义两个结构体变量student1和student2,成员包括学号、姓名、性别、出生日期、成绩。对student2初始化,再把student2的值赋给student1。输出student1的各成员
"."是成员运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待。上面赋值语句的作用是将整数10010赋给 student1变量中的整型成员num。(2)可以引用一个结构体变量中的一个成员的值。例如:student1.num表示结构体变量 student1中的成员num的值。赋值时,结构体变量student2中的各个成员的值分别赋给结构体变量student1中相应的成员。(1)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。
2024-06-15 17:58:28
426
原创 对3个变量按由小到大的顺序排序
读者可以看到:这个程序很容易理解,不易出错。由于在调用sort函数时虚实结合使形参i,j,k成为实参a,b,c的引用,因此通过调用函数sort(a,b,c)即实现了对i,j,k排序,也就是实现了对a,b,c排序。同样,执行change(i,j)函数,可以实现对实参i和j的值的互换。引用不仅可以用于变量,也可以用于类对象。例如实参可以是一个类对象名,在虚实结合时传递类对象的起始地址。在C++面向对象的程序设计中常用到引用,希望读者很好地理解和掌握它。
2024-06-14 12:18:40
472
原创 用“引用“作形参,实现两个变量的值互换
请注意:在此处&a不是"a的地址",而是指"a是一个整型变量的引用(别名),&是引用声明符。当main函数调用swap函数时,进行虚实结合,把实参变量i和j的地址传给形参a和b。同理,b成为j的别名。在swap函数中使a和b的值对换,显然,i和j的值同时改变了。,可以发现,C++在调用函数时有两种方式:传值方式和传址方式,用引用型形参的方法比使用指针型形参的方法简单、直观、方便,可以部分代替指针的操作。以引用作为形参,在虚实结合时建立变量的引用,使形参名作为实参的"引用",即形参成为实参的引用。
2024-06-13 13:41:05
430
原创 使引用作为函数参数将变量i和j的值互换
调用函数时把变量i和j的地址传送给形参p1和p2(它们是int*型指针变量),因此*p1和i为同一内存单元,*p2和j为同一内存单元。显然,i和j的值改变了。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)得到实参变量的地址,因此指向实参变量单元。通过形参指针变量访问主函数中的变量(i和j),并改变它们的值。这样就能得到正确结果,但是在概念上却兜了一个圈子,不那么直截了当。C++之所以增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能。
2024-06-12 11:00:04
579
原创 通过引用得到变量的值
a的值开始为10,b是a的引用,它的值当然也应该是10,当a的值变为100(a*a的值)时,b的值也随之变为100。在输出a和b的值后,b的值变为20,显然a的值也应为20。
2024-06-11 10:00:05
518
原创 用函数指针求a和b中的大者
注意在定义指向函数的指针变量p时,(*p)两侧的括号不可省略,表示p先与*结合,它是指针变量,然后再与后面的()结合,表示此指针变量指向函数,这个函数值(即函数返回的值)是整型的。",则由于()优先级高于*,它就成了声明一个函数了(这个函数的返回值是指向整型变量的指针)。此语句千万不要漏写,它的作用是将函数max的入口地址赋给指针变量p。这时,p才指向函数max。//max 函数原型。可以用一个指针变量指向max函数,然后通过该指针变量调用此函数。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
2024-06-10 16:30:24
674
原创 将字符串str1复制为字符串str2
先使p1和p2分别指向字符数组元素str1[0]和str2[0]。此时*p1的值为"I",赋值语句"*p2=*p1;"的作用是将str1[0](字符'I')赋给p2所指向的元素,即str2[0]。然后p1和p2分别加1,各自指向其下面的一个元素,再将str1[1]的值赋给str2[1]……注意p1和p2的值是不断在改变的。定义两个字符数组str1和str2,再设两个指针变量p1和p2,分别指向两个字符数组中的有关字符,通过改变指针变量的值使它们指向字符串中的不同的字符,以实现字符的复制。
2024-06-09 13:25:10
886
原创 在C++中用3种方法访问一个字符串
在这里没有定义字符数组,在程序中定义了一个字符指针变量str,用字符串常量"I love CHINA!对字符指针变量str的初始化,实际上是把字符串中第1个字符的地址赋给str。在输出时,系统先输出str所指向的第1个字符数据,然后使str自动加1,使之指向下一个字符,然后再输出一个字符……注意,在内存中,字符串的最后被自动加了一个'\0',因此在输出时能确定字符串的终止位置。str是字符数组名,它代表字符数组的首元素的地址,输出时从str指向的字符开始,逐个输出字符,直至遇到'\0'为止。
2024-06-08 18:08:19
551
原创 将10个整数按由小到大的顺序排列
在调用此函数时,通过虚实结合,将主函数中的数组a的首元素地址传递给形参p,因此p就指向数组a的首元素。在select_sort函数中通过对指针变量p的操作,可以访问a数组的各元素,例如*(p+1)就是a[1],*(p+j)就是a[j],*(p+k)就是a[k],*(p+i)就是a[i]。用户可以认为有一个形参数组,它从实参数组那里得到起始地址,因此形参数组与实参数组共占同一段内存单元,在调用函数期间,如果改变了形参数组的值,也就是改变了实参数组的值,在主调函数中可以利用这些已改变的实参数组的值。
2024-06-07 15:20:45
673
原创 输出有10个元素的整型数组各元素的值
数组a最后一个有效的元素是a[9],现在要求输出a[10],但C++编译系统并不把它认作非法。系统按p+10xd计算出要访问单元的地址,这显然是a[9]后面一个单元的地址,然后输出这个单元中的内容。C++编译系统是将a[i]转换为*(a+1)处理的,对每个a[i]都分别计算地址a+ixd,然后访问该元素。第(3)种方法比方法(1)、(2)快,用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。//要输出a[10]的值。将上面程序第7行和第10行的a[i]改为"*(a+i)"。
2024-06-06 15:25:07
437
原创 输入a,b,c3个整数,按由大到小的顺序输出
exchange函数的作用是使指针变量p1,p2,p3所指向的整型变量按由大到小的顺序交换它们的值。在执行exchange函数的过程中执行swap函数,以实现两个变量的值互换。在对函数exchange 和swap作原型声明时,在形参表中只写了数据类型(int *),而没有写形参名,这样看起来可能更清晰些。读者在看到数据类型"int *"时,应该很快地判定这是声明基类型为整型的指针变量。用3个指针变量指向3个整型变量,然后用swap函数来实现互换3个整型变量的值。
2024-06-05 10:00:39
634
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人