博文
《彻底搞定C指针》-——第5篇:函数参数的传递(下) (2006-07-28 03:34:00)
摘要:
《彻底搞定C指针》-——第5篇:函数参数的传递(下)
白云小飞
三. 函数参数传递方式之二:地址传递继续——地址传递的问题!看题二的代码: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=6,*py=4 a=6,b=4 看函数的接口部分:Exchg2(int *px,int *py),请注意:参数px,py都是指针。 再看调用处:Exchg2(&a, &b); 它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px,py。px=&a;py=&b; 呵呵!我们发现,其实它与值传递并没有什么不同,只不过这里是将a,b的地址值传递给了px,py,而不是传递的a,b的内容,而(请好好地在比较比较啦) 整个Exchg2函数调用是如下执行的: px=&a; // py=&b; //请注意这两行,它是调用Exchg2的隐含动作。 int tmp=*px; *px=*py; *py=tmp;&......
《彻底搞定C指针》-——第5篇:函数参数的传递(上)(2006-07-28 03:34:00)
摘要:彻底搞定C指针-——第五篇:函数参数的传递
白云小飞
一. 三道考题开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?)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; ......
《彻底搞定C指针》第4篇const int * pi/int * const p(2006-07-28 03:32:00)
摘要:
《彻底搞定C指针》第4篇const int * 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指针》第3篇--指针与数组名(2006-07-28 03:31:00)
摘要:
《彻底搞定C指针》第3篇--指针与数组名
白云小飞
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在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的......
[转]《彻底搞定C指针》第2篇----指针是什么(2006-07-28 03:29:00)
摘要:《彻底搞定C指针》第2篇----指针是什么
白云小飞
二.指针是什么东西指针,想说弄懂你不容易啊!我们许多初学指针的人都要这样的感慨。我常常在思索它,为什么呢?其实生活中处处都有指针。我们也处处在使用它。有了它我们的生活才更加方便了。没有指针,那生活才不方便。不信?你看下面的例子。这是一个生活中的例子:比如说你要我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一张纸条放在你的桌上。纸条上写着:你要的书在第2层3号的书架上。当你回来时,看到这张纸条。你就知道了我借与你的书放在哪了。你想想看,这张纸条的作用,纸条本身不是书,它上面也没有放着书。那么你又如何知道书的位置呢?因为纸条上写着书的位置嘛!其实这张纸条就是一个指针了。它上面的内容不是书本身,而是书的地址,你通过纸条这个指针找到了我借给你的本书。那么我们C,C++中的指针又是什么呢?请继续跟我来吧,看下面看一个申明一整型指针变量的语句如下:int * pi;pi是一个指针,当然我们知道啦,但是这样说,你就以为pi一定是个多么特别的东西了。其实,它也只过是一个变量而已。与上一篇中说的变量并没有实质的区别。不信你看下面图。内存地址→6 7 8 9 10 11 12 13 14--------------------------------------------------------------···| 30 | ‘t’ | | | | &nb......
[转]《彻底搞定C指针》第1篇---变量的内存实质(2006-07-28 03:27:00)
摘要:《彻底搞定C指针》第一篇 变量的内存实质
白云小飞
一.先来理解C语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质,所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图:
内存地址→ 6 7 8 9 10 11 12 13----------------------------------------------------------------- ··· | | | | | | | |··-----------------------------------------------------------------
如图所示,内存只不过是一个存放数据的空间,就好像我的看电影时的电影院中的座位一样。每个座位都要编号,我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧!所以内存也要象座位一样进行编号了,这就是我们所说的内存编址。座位可以是按一个座位一个号码的从一号开始编号,内存则是按一个字节一个字节进行编址,如上图所示......
