博文
彻底搞定C指针-指针与数组名(2005-09-23 14:20:00)
摘要:
三.指针与数组名1. 通过数组名访问数组元素看下面代码int i,a[]={3,4,5,6,7,3,7,4,4,6};for (i=0;i<=9;i++){ printf ( “%d”, a[i] );}很显然,它是显示a 数组的各元素值。我们还可以这样访问元素,如下int i,a[]={3,4,5,6,7,3,7,4,4,6};for (i=0;i<=9;i++){ printf ( “%d”, *(a+i) );}它的结果和作用完全一样2. 通过指针访问数组元素int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};pa =a ;//请注意数组名a直接赋值给指针pafor (i=0;i<=9;i++){ printf ( “%d”, pa[i] );}很显然,它也是显示a 数组的各元素值。另外与数组名一样也可如下:int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};pa =a;for (i=0;i<=9;i++){ printf ( “%d”, *(pa+i) );}看pa=a即数组名赋值给指针,以及通过数组名、指针对元素的访问形式看,它们并没有什么区别,从这里可以看出数组名其实也就是指针。难道它们没有任何区别?有,请继续。3. 数组名与指针变量的区别请看下面的代码:int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};pa =a;for (i=0;i<=9;i++){ printf ( “%d”, *pa ); pa++ ; //注意这里,指针值被修改}可以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针常量。这个代码与上面的代码不同的是,指针pa在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:a++。......
彻底搞定C指针-const int * pi/int * const pi的区别(2005-09-23 14:18:00)
摘要:const int * pi 、int const * pi与int * const pi及其操作1 从const int i 说起 你知道我们申明一个变量时像这样int i ;这个i是可能在它处重新变赋值的。如下:int i=0;//…i=20;//这里重新赋值了 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在申明时就赋一个初始值。之后我的程序在其它任何处都不会再去重新对它赋值。那我又应该怎么办呢?用const 。//**************const int ic =20;//…ic=40;//这样是不可以的,编译时是无法通过,因为我们不能对const 修饰的ic重新赋值的。//这样我们的程序就会更早更容易发现问题了。//************** 有了const修饰的ic 我们不称它为变量,而称符号常量,代表着20这个数。这就是const 的作用。ic是不能在它处重新赋新值了。 认识了const 作用之后,另外,我们还要知道格式的写法。有两种:const int ic=20;与int const ic=20;。它们是完全相同的。这一点我们是要清楚。总之,你务必要记住const 与int哪个写前都不影响语义。有了这个概念后,我们来看这两个家伙:const int * pi与int const * pi ,按你的逻辑看,它们的语义有不同吗?呵呵,你只要记住一点,int 与const 哪个放前哪个放后都是一样的,就好比const int ic;与int const ic;一样。也就是说,它们是相同的。 好了,我们现在已经搞定一个“双包胎”的问题。那么int * const pi与前两个式子又有什么不同呢?我下面就来具体分析它们的格式与语义吧!2 const int * pi的语义 我先来说说const int * pi是什么作用 (当然int const * pi也是一样的,前面我们说过,它们实际是一样的)。看下面的例子://****......
彻底搞定C指针-函数参数的传递(很详细)(2005-09-23 14:16:00)
摘要: 一. 三道考题开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?)1. 考题一:程序代码如下:void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d\n”,x,y)}void main(){ int a=4,b=6; Exchg1 (a,b) ; printf(“a=%d,b=%d\n”,a,b)}输出的结果:x=____, y=____a=____, b=____问下划线的部分应是什么,请完成。2. 考题二:代码如下。Exchg2(int *px, int *py){ int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d\n”,*px,*py);}main(){ int a=4; int b=6; Exchg2(&a,&b); Print(“a=%d,b=%d\n”, a, b);}输出的结果为:*px=____, *py=____a=____, b=____问下划线的部分应是什么,请完成。3. 考题三:Exchg2(int &x, int &y){ int tmp=x; x=y; y=tmp; print(“x=%d,y=%d\n”,x,y);}main(){ int a=4; int b=6; Exchg2(a,b); &nbs......
厦门大学2005c++年程序设计题(2005-09-23 13:18:00)
摘要:题目:1. 取胜之道Program国度的人,喜欢玩这样一个游戏,在一块板上写着一行数,共n个。两个游戏者,轮流从最右或最左取一个数。刚开始,每个游戏者的得分均为零。如果一个游戏者取下一个数,则将该数的值加到该游戏者的得分上,最后谁的得分最高谁就赢了游戏。给出这n个数( 从左往右), 假设游戏者都是非常聪明的,问最后两个人的得分(假设第一个人首先取数).输入格式:第一行为n(2<=n<=100),第二行为n个数,每个数字之间均用空格隔开。输出为两个游戏者的得分.第一个数表示第一个游戏者的得分,第二个数为第二个游戏者的得分,两个数字之间用空格隔开。如输入64 7 2 9 5 2输出18 11程序://主要算法思想是考虑题目中的"游戏者都是非常聪明"这句话#includeusing namespace std;const int N=20;int array[N];int mininum(int x,int y){ return x>y?x:y;}void defen(int x){ int count=0,firstscore=0,secondscore=0,i=0,j=x-1,mini1=0,mini2=0;loop: mini1=mininum(array[i+1],array[j]); mini2=mininum(array[i],array[j-1]); if(count......
