//题目1
//int a[3];
//a[0]=0; a[1]=1; a[2]=2;
//int *p, *q;
//p=a;
//q=&a[2];
//a[q-p]的值是多少?为什么?
#include <iostream>
using namespace std;
int main(int argc, const char * argv[])
{
int a[3];
a[0]=0;
a[1]=1;
a[2]=2;
int *p,*q;
p=a;
q=&a[2];
cout<<a[q-p]<<endl;
cout<<q<<endl;
cout<<p<<endl;
cout<<q-p<<endl; //相差八个字节,因为int类型是4个字节,所以下标为2,所以a[2]=2
return 0;
}
//题目2
//const 有什么用途?请用附上代码例子佐证!
#include <iostream>
//const作用
1.可以定义const常量,具有不可变性
例如:const int MAX=100;int Array[MAX];
2.便于编译器进行类型检查,使编译器对处理内容有更多的了解,消除一些隐患。例如:void f(const int i){} 编译器就知道i是一个常量,不允许修改;
3.可以避免意义模糊的数字出现,同样可以很方便的进行参数的调整和修改。同宏定义一样,可以做到不变则以,一变都变!在(1)中,如果想修改MAX的内容,只需要修改:const int MAX=you want即可;
4.可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。还是上面的例子,如果在函数体内修改了i,编译器就会报错,例如:
void f(const int i){i=10;//error}
5.为重载函数提供了一个参考
class A{
void f(int i){...}//一个函数
void f(int i)const{...}//上一个函数的重载
};
6.可以节省空间,避免不必要的内存分配。例如
#define PI 3.14159 //常量宏
const double Pi=3.14159;//此时并未将Pi放入ROM中。。。
double i=Pi;//此时为Pi分配内存,以后不再分配!
double i=PI;//编译起见进行宏替换,分配内存
double j=Pi;//没有内存分配
double J=Pi;//再次进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,#define定义的常量在内存中又若干份拷贝
7.提高了效率,编译器通常不为普通的const常量分配内存空间,而是将他们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读取内存的操作,是的它的效率更高。
//题目3:
//引用跟指针的区别?请用附上代码例子佐证!
//1.从内存上来讲,系统为指针分配内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内存空间
//2.指针初始化后可以改变指向的对象,而引用定义的时候必须要初始化,而且初始化后不允许再重新绑定对象
//3.所以引用访问对象是直接访问的。指针访问对象是间接访问的。
//4.如果pa是指针,那么*pa就是引用了。但是两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝。
#include <iostream>
using namespace std;
void pt(int *pta,int *ptb)
{
int *ptc;
ptc=pta;
pta=ptb;
ptb=ptc;
}
void ref(int &ra,int &rb)
{
int rc;
rc=ra;
ra=rb;
rb=rc;
}
int main(int argc, const char * argv[])
{
int a=3;
int b=4;
int *pa=&a;
int *pb=&b;
pt(pa,pb);
cout<<a<<' '<<b<<endl;
ref(a,b);
cout<<a<<' '<<b<<endl;
return 0;
}
//题目4:
//学生类:学生的姓名成绩及相关的运算,添加英语成绩,并根据总成绩对学生姓名进行排序
#include <iostream>
using namespace std;
class Student
{
private:
char name[20];
float ChineseScore,MathScore,EnglishScore,Total;
public:
void student(char *Name,float chinese,float math);
void addEnglishScore();
void countTotalScore(double &total);
void getScores(char **name,double &chinese,double &math,double &english);
void showStudent(char *name,double ch,double ma,double en,double total);
float total();
char* Name();
float ch();
float ma();
float en();
void setTotal(float p);
};
void Student:: setTotal(float p)
{
Total=p;
}
char * Student::Name(){
char *p=name;
return p;
}
float Student::ch()
{
return ChineseScore;
}
float Student:: ma()
{
return MathScore;
}
float Student::en()
{
return EnglishScore;
}
void Student::student(char *Name,float chinese,float math)
{
int i=0;
while (*Name!='\0') {
name[i]=*Name;
Name++;
i++;
}
name[i] = '\0'; //加上\0结束,防止输出的name有乱码
ChineseScore = chinese;
MathScore = math;
}
void Student::addEnglishScore()
{
cout<<"请添加英语成绩"<<endl;
cin>>EnglishScore;
}
void Student::countTotalScore(double &total)
{
total = ChineseScore + MathScore + EnglishScore;
}
void Student::getScores(char **Name,double &chinese, double &math, double &english)
{
char *p=name;
*Name=p;
chinese=ChineseScore;
math=MathScore;
english=EnglishScore;
}
float Student::total()
{
return Total;
}
void Student::showStudent(char *name,double ch,double ma,double en,double total)
{
cout<<"姓名:"<<name<<" "<<"语文:"<<ch<<" "<<"数学:"<<ma<<" "<<"英语:"<<en<<" "<<"总分:"<<total<<endl;
}
float *funB(float *pNum,int N)
{
if (N>0) {
for (int i=0; i<N-1; i++) {
for (int j=0; j<N-1-i; j++) {
if(pNum[j]>pNum[j+1])
{
float temp;
temp=pNum[j];
pNum[j]=pNum[j+1];
pNum[j+1]=temp;
}
}
}
}
float* p=pNum;
return p;
}
int main(int argc, const char * argv[])
{
cout<<"请输入N:"<<endl;
int N;
cin>>N;
Student stu[N];
int i=0;
float a[N];
do {
//Student stu[i];
stu[i].student("dingxiaowei", 90, 91);
stu[i].addEnglishScore();
char *Name;
double ch,ma,en,total;
stu[i].getScores(&Name,ch, ma, en);
stu[i].countTotalScore(total);
stu[i].showStudent(Name, ch, ma, en,total);
a[i]=total;
stu[i].setTotal(total);
//cout<<a[i]<<endl;
i++;
} while (i<N);
// 打印存储的数据
cout<<"\n"<<"total的成绩:\n";
for (int i=0; i<N; i++) {
printf("%.2f \n",stu[i].total());
}
//排序后的顺序
cout<<"\n按照成绩排序后的学生:"<<endl;
float *p = funB(a, N);
for (int j=0; j<N; j++) {
for (int i=0; i<N; i++) {
if (p[j]==stu[i].total()) {
stu[i].showStudent(stu[i].Name(), stu[i].ch(), stu[i].ma(), stu[i].en(),stu[i].total());
break;
}
}
}
// Student stu1;
// stu1.student("dingxiaowei", 90, 91);
// stu1.addEnglishScore();
// char *Name1;
// double ch1,ma1,en1,total1;
// stu1.getScores(&Name1,ch1, ma1, en1);
// stu1.countTotalScore(total1);
// stu1.showStudent(Name1, ch1, ma1, en1,total1);
//
//
//
// Student stu2;
// stu2.student("wangnin", 90, 92);
// stu2.addEnglishScore();
// char *Name2;
// double ch2,ma2,en2,total2;
// stu2.getScores(&Name2,ch2, ma2, en2);
// stu2.countTotalScore(total2);
// stu2.showStudent(Name2, ch2, ma2, en2,total2);
//
//
//
// if (total1>=total2) {
// cout<<"成绩由高到低排序"<<endl;
// stu1.showStudent(Name1, ch1, ma1, en1, total1);
// stu2.showStudent(Name2, ch2, ma2, en2, total2);
// }
// else{
// cout<<"成绩由高到低排序"<<endl;
// stu2.showStudent(Name2, ch2, ma2, en2, total2);
// stu1.showStudent(Name1, ch1, ma1, en1, total1);
// }
return 0;
}