通过指针赋值,访问数组元素:
int a[10],*ptr;
ptr=a;
则ptr[n]即数组元素(下标法),等效于*(ptr+n),n为0--9;(不要这么用)
*ptr++:当前变量的值是*ptr,然后指针增加一个变量所占的字节数,下次*ptr是新的变量值。
*(a+n):数组名也能作指针方式使用。(不要这么用)
访问二维数组时:
int a[n][m],*ptr;//声明了一个整型二维数组,和一个整型变量的指针。
ptr=a[0];//a[n]代表数组第n行首地址。
则*ptr++依次代表数组元素,先从a[0][0]到a[0][m-1]代表第一行所有元素,然后第二行从a[1][0]开始,直到结束。
int a[3][4];
int (*ptr)[4];代表二维数组,ptr指向每行首地址,例如a[n]。
ptr=a;//a与a[0]等效,二维数组首地址
则*(*(ptr+1)+2)代表a[1][2]元素。//*(ptr+1)是下一行元素的首地址,*(ptr+1)+2是该行第2列地址(从0列算起)
===================================
通过指针赋值,在一个函数中调用另一个函数:
void result(int (*p)(),int a,int b);//声明一个函数,其形参含有一个函数指针。随后在result函数编写中,使用(*p)(a,b)来调用指针函数,该函数与add函数形参格式一致。
int (*pf)();//声明一个指向函数的指针,该函数返回值是int型
pf=add;//该指针指向加法函数,加法函数在随后编写,其形参格式为int add(int a,int b)。
result(pf,i,j);//调用加法函数,来实现result函数。
===================================
通过指针,来访问另一个函数的处理结果:(该函数调用完毕后,只返回一个地址,即指针)
char *substr(char *dest,char *src,int begin,int len)
{......
return dest;
}
定义了一个函数,返回值是指针,该指针指向char型变量。substr函数中调用memmove库函数处理src字符串,给dest串赋值。
main函数中,处理如下:
char *dest;//声明一个字符变量指针,用于存放字符处理结果的首地址。
char src[]="C Programming Language";
后续使用printf("%s\n",substr(dest,src,15,4));来打印dest字符串。//把src字符串处理到以dest为首地址的空间中,然后打印。
但dest字符串一定要事先申请分配空间,例如用malloc函数,否则指针赋值不稳定。因为不知道substr函数要在dest指针后面生成多少字符串。
=========================================
指针数组,即声明了一堆指针:
int *ptr[5];代表指针数组,每个ptr[n]可以指向int型变量或int型数组首地址。例如*ptr[3]代表某个int型变量。
指向指针的指针:int **ptr;最终指向int型变量的指针。使用时,一般用*ptr进行操作,代替变量的指针。
=========================================
main函数也可以带形参,如下:
main(int argc,char *argv[])
{....}
其中argc是命令行的参数个数,argv指向各种命令。
main函数不能被调用,而是通过程序保存的文件名来调用。例如test.c文件,test就是exe的文件名和命令名。
各种命令直接通过argv输入到程序内,例如命令:test vfp access "SQL SERVER"(各命令用空格区分,双引号内即使有空格,也视为一个命令)
这里的argc是4,算上test在内。test是命令,其余是参数。
这种main函数需要编译成exe文件,并在dos环境下输入相应命令来执行。
==========================================
C51中的指针定义:
变量类型 存储类型1 *存储类型2 ptr;
其中,存储类型1代表变量所在的存储区;不写时,变量的存储类型由编译模式决定。此时ptr占用3个字节,第一字节为变量所在的存储区类型编码,第2,3字节为高位和低位偏移地址。写了存储类型1,则ptr可能是占用2个字节。ptr占用多少空间不重要,只需调用即可。
存储类型2代表指针所在的存储区,分为data/idata/bdata,xdata,pdata,code四种。不写时,指针在片内数据存储区中,即data区。xdata为片外数据区。
在51编程中声明指针时,最关键是要写明存储类型1,即准备指向哪里的变量。
例如char xdata * ptr;//指向xdata区中的char型变量,指针ptr位于片内存储区。
书中举例仅仅是指向了一个一维数组,并打印。