一.题目。分析程序运行结果 1.源代码(带注释) #include
void swapref(int *p1,int *p2); //函数声明 int main() { cout<<\ int iv1=888; //定义iv1等于888 int *pointer_1; //定义指针1 pointer_1=&iv1; //指针1指向iv1的数据地址 cout<<\ = \ cout<<\ //都输出888 cout<<\ = \ cout<<\ = \ //输出地址 cout<<\ int iv2=666; //定义iv2=666 int *pointer_2; //定义指针2 pointer_2=&iv2; //指针2指向iv2的数据地址 cout<<\ = \ cout<<\ //都输出666 cout<<\ = \ cout<<\ = \ //输出地址 cout<<\ swap(pointer_1,pointer_2); //调换pointer1和pointer2,pointer1和pointer2存放的是地址 cout<<\ = \ cout<<\ = \ //调换的是指针的地址,因此iv1和iv2的值不变 cout<<\ cout<<\ //指针1和指针2指向的对象被调换,因此*pointer_1=666,*pointer_2=888 cout<<\ = \ cout<<\ = \ //因地址被调换,所以输出pointer_1与pointer_2输出的地址被调换 return 0; }
void swap(int *p1,int *p2) //指针调换函数 { int temp; temp=*p1; *p1=*p2;
*p2=temp; }
2.结论初步熟悉指针的调用。 3.思考题答案 (1)注释看上代码。
(2)如果swap函数更改后,结果无变化,因为掉换的是地址
(3) 如果swap函数更改后,函数调用也更改后,iv1和iv2的值被掉换,因此*pointer_1和*pointer_2的值也被调换,但因为他们的地址没被调换,因此pointer_1和pointer_2的地址值没有变化。
二.题目 班级课程成绩计算 1.源代码:
#include
void averscore(int sco[][5],int avsco[5]) { int i,j,sum; for(i=0;i<5;i++){ sum=0; for(j=0;j<5;j++) sum=sum+sco[i][j]; avsco[i]=sum/5; } }
int avercourse(int (*psco)[5],int n) { int i,sum=0; for(i=0;i<5;i++) sum=(*psco+n)[i*5-1]+sum; return sum/5; }
void main() { int num[5]; int sco[5][5]; int avsco[5]; int i,j,sum,n; for(i=0;i<5;i++) num[i]=i+1; for(i=0;i<5;i++){ cout<<\请输入学号为\的学生的5门课程成绩(空格隔开):\\n\ for(j=0;j<5;j++) cin>>sco[i][j]; }
averscore(sco,avsco); for(i=0;i<5;i++){ cout<<\学号为\的学生的5门课程平均分为:\五门课程的成绩分别为:\ for(j=0;j<5;j++) cout<
2.结论:初步熟悉指针对函数的调用。 3.思考题答案: (1)第二维需要足够的大小才可以接收二维数组的值,不指定第二维大小会造成空间不足。 (2)*(p+i)代表了i行的值,同理(*(p+i)+j)的j代表了j列,二级指针可调用二维数组的值。
三.题目:排序查找 1.源代码:
#include
int half(int *p,int n,int m) { int k; k=n/2; if(*p n=k; k=k/2; } else if(*(p+k)>m) k=(n-k)/2+k; else return k+1; } } void main() { int i,n,m,result; int *a; cout<<\请输入整数n:\ cin>>n; a=new int[n]; cout<<\请输入\个整数:\ for(i=0;i 2.结论:初步熟悉排序法和折半查找法的应用。 3.思考题答案: (1)因为以上程序为例调用时相当于*p=a (2)指针函数是用指针作为计算的变量,指针实际指向数组,而函数指针是在函数调用时通过函数指针调用数据。
相关推荐: