关于指针

来源:互联网 发布:c语言小程序100例 编辑:程序博客网 时间:2024/05/19 02:21

#1 首先要知道的是 *运算符比[ ](对于数组)和( )(对于函数)运算符优先级低。这有助于理解指针到底是指向什么的指针。例如:
char array[5];  /*char (array[5])*/
char *array1[5];  /*char (*(array[5]))  指针数组,array中放着5个指向char的*/
char (*array2)[5];  /*数组指针,指向一个由5个char元素的数组*/
同样:
int fun();
int *fun();  /*int (*(fun()))  fun为一函数,返回一个指向int的指针*/
int (*fun)();  /*函数指针  (*fun)指向一个返回int的函数*/
下面这个比较复杂:
int (*array[5])();  /*用上面的方法可知,是函数指针数组,数组每个元素都是指向函数的指针*/

#2 函数指针的声明与使用。
void (*pf)(void);  /*声明一个函数指针*/
pf=fun;  /*fun()为一个函数*/
(*pf)();  /*调用fun()*/
也可以这样调用
pf();
再说一种特殊的函数指针:调用从地址0x12345678开始的某段代码(假定返回值为void)
(*(void (*)()) 0x12345678)();
因为void (*f)();中f类型为 void (*)(),所以对0x12345678做强制类型转换就得到一个函数指针,用该指针调用函数即得上面的结果。

#3数组和指针。
一个经典的错误:
//test.c
#include <stdio.h>
extern int *array;
main()
{
 array[0]=1;
 return 0;
}
//testa.c
int array[5]={0};
编译时无错误,但运行就会出错,你会发现数组array[5]的首地址为0。
原因是在testa.c中将array每个元素初始化为0,而在test.c中相当于按指向int的指针方式从内存中取出相应内容给array,所以array首地址为0。
另外还要注意,对于一个函数void fun(int a[ ])或者void fun(int a[5 ]),调用该函数时起时都是相当于把数组的指针传入,即void fun(int *a)

#4指针数组和数组指针
指针数组一般用于多个字符串,如main函数参数表中第二个参数
int main(int argc,char *argv[ ])

int main(int argc,char **argv)
这时相当于双重指针
argv[m]类型是char *,argv[m][n]类型是char。设argv值是X,则argv[m][n]的地址为:(*(X+4*m)+n).
而对于二维数组(数组指针与此类似)char array[i][j],argv[m][n]其地址为(X+j*m+n)