我们已经知道,指针就是首地址。 在日常生活中,我们认识了一个人A,而后我们用他的电话联系他,当然关系好些,可以留下其地址,以便登门拜访。于是我们用一个本子,记录下电话和地址,这个记录电话地址的本子,就是我们常说的电话本儿,现在我们的手机里面就有电话本,功能强些的电话簿,还有记录地址的功能。通过地址我们就可以找到他们。因此,记录地址是我们日常必需的一个工作。 在计算机中, 我们定义了一个变量A,而后我们用变量名A访问它,当然深入编程,也可留下A的首地址,以便登门拜访。于是我们需要记录下A的首地址;C语言中,我们可以使用一个变量B来记录A的首地址的,这里的B是一种特殊的变量,是专门用来存放地址的变量;有关这种地址变量的定义,我们会在后面描述。通过B中的地址,我们就可以找到A了。因此,存储首地址是我们C编程必需的一个工作。 好,现在,我们首先,对地址簿中,可能的地址,进行分类, 日常生活中,我们的地址簿是一个本子,其中人的地址是按照朋友、同学、同事、亲戚、好友等等分类的,而且可以用不同颜色的笔来区别!比如红笔写的地址,代表朋友。黑笔,代表同学。黄笔,代表同事。绿笔,代表亲戚。蓝笔,代表好友。 电脑编程中,我们的地址簿中存放的是一些变量或函数的首地址。我们不能用颜色来分类地址,而是按照整型、浮点、字符、数组、函数等等对地址进行分类,分成整型地址、浮点地址、字符地址、数组地址、函数地址等等,也就是说地址是有类型的,这些类型是繁杂的,需要认真加以区别和记忆! 1、普通变量首地址的类型: 我们已经很熟悉,用int定义的变量,能存放-32768~+32767这个范围内整数,这种变量的首地址是有类型的,类型是int *,这里*的意思就是地址类型。 例如:有int a;那么int a的首地址我们简写成&a,于是&a的类型就是int * 如果说,int变量和int变量的首地址之间有类型的对应关系的话, 那么,变量是int类型,相应的,该变量首地址是int *类型,简写为: int ---->>>> int * 同理:float---->>>>float * char---->>>>char * unsigned---->>>>unsigned * long---->>>>long * ..................... 2、一维数组首地址的类型: int---->>>>int * float---->>>>float * char---->>>>char *; 例如:int a[10]; 其首地址就是数组名a , 于是a就是int *类型的。 而此数组中,任意一个元素的首地址的类型, 也是int *类型的 。 比如a[5]的首地址是&a[5], 也是int *类型的 3、二维数组首地址的类型: 假设有2维数组定义如下: int a[3][4]; 那么把int a[3][4],用小括号把数组名括起来变成int (a)[3][4],再把数组名变成*,即int(*)[3][4],接着把表示行数的部分[3]去掉,变成int (*)[4],就是这个2维数组地址的类型。 int a[3][4]; ------>>>> int (*)[4] 一般的,二维int 数组名[数组行数][n]----->>>>int (*)[n],而此二维数组每行必须有n列。 于是同理: 二维float 数组名[数组行数][n]----->>>>float (*)[n] 二维char 数组名[数组行数][n]---->>>>char (*)[n] 4、函数首地址的类型: 对于函数,假设,有函数int F(void){...},那么,用int (*)(void)作为它的首地址(又称入口地址)的类型。 这个类型是如何来的呢?就是把其函数首部 int F(void),用小括号把函数名括起来变成int (F)(void),再把函数名变成*,即int(*)(void),就是该函数入口地址的类型。 int F(void){...}---->>>>int (*)(void) 从上面可以看到,地址类型中,都用到一个* 我们已经知道,首地址就是指针,因此上述地址类型,就是指针类型。 学习指针的第一关就是能熟悉上面这些繁杂的地址类型的写法,这,是必须穿越的第一关哦 |