博文
彻底搞定C指针-函数名与函数指针(2005-10-14 23:35:00)
摘要: 函数名与函数指针一 通常的函数调用 一个通常的函数调用的例子://自行包含头文件void MyFun(int x); //此处的申明也可写成:void MyFun( int );int main(int argc, char* argv[]){ MyFun(10); //这里是调用MyFun(10);函数 return 0;}void MyFun(int x) //这里定义一个MyFun函数{ printf(“%d\n”,x);} 这个MyFun函数是一个无返回值的函数,它并不完成什么事情。这种调用函数的格式你应该是很熟悉的吧!看主函数中调用MyFun函数的书写格式:MyFun(10); 我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数,知道MyFun函数名代表的是一个功能(或是说一段代码)。 直到—— 学习到函数指针概念时。我才不得不在思考:函数名到底又是什么东西呢? (不要以为这是没有什么意义的事噢!呵呵,继续往下看你就知道了。)二 函数指针变量的申明 就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。 在C系列语言中,任何一个变量,总是要先申明,之后才能使用的。那么,函数指针变量也应该要先申明吧?那又是如何来申明呢?以上面的例子为例,我来申明一个可以指向MyFun函数的函数指针变量FunP。下面就是申明FunP变量的方法:void (*FunP)(int) ; //也可写成v......
彻底搞定C指针-指向另一指针的指针 (2005-10-06 23:24:00)
摘要: 指向另一指针的指针一. 回顾指针概念:早在本系列第二篇中我就对指针的实质进行了阐述。今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!当我们程序如下申明变量:short int i;char a;short int * pi;程序会在内存某地址空间上为各变量开辟空间,如下图所示。内存地址→6 7 8 9 10 11 12 13 14 15-------------------------------------------------------------------------------------… | | | | | | |  ......
彻底搞定C指针-变量的内存实质(2005-09-23 14:21:00)
摘要:一.先来理解C语言中变量的实质要理解C指针,我认为一定要理解C中“变量”的存储实质,所以我就从“变量”这个东西开始讲起吧!先来理解理解内存空间吧!请看下图:内存地址→ 6 7 8 9 10 11 12 13---------------------------------------------------------------------------- ··· | | | | | | | | |··--------------------------------------------------------------------------- 如图所示,内存只不过是一个存放数据的空间,就好像我的看电影时的电影院中的座位一样。每个座位都要编号,我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧!所以内存也要象座位一样进行编号了,这就是我们所说的内存编址。座位可以是按......
彻底搞定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......
