C语言指针的函数运用和数组

来源:互联网 发布:国家药品食品数据查询 编辑:程序博客网 时间:2024/05/16 02:12

1.指针数组与数组指针
(1)指针数组:
指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量。
(2)数组指针:
数组指针的实质是一个指针,这个指针指向的是一个数组。
分析:int p[5]; int (*p)[5]; int (p[5]);
①int *p[5]; 核心是p,p是一个数组,数组有5个元素大,数组中的元素都是指针,指针指向的元素类型是int类型的;整个符号是一个指针数组。
②int (*p)[5];核心是p,p是一个指针,指针指向一个数组,数组有5个元素,数组中存的元素是int类型; 总结一下整个符号的意义就是数组指针。
③int *(p[5]); 解析方法和结论和第一个相同,()在这里是可有可无的。

2.函数指针
(1)函数指针:
函数指针的实质还是指针,还是指针变量。本身占4字节。函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的),所以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在C语言中用函数名这个符号来表示。结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型,它的值就是某个函数的地址。
函数是:void func(void); 对应的函数指针:void (p)(void); 类型是:void ()(void);
(2)typedef关键字:
typedef是C语言中一个关键字,作用是用来定义(或者叫重命名类型)。
例如:
int add(int a, int b);
typedef int (*pFunc)(int, int);
int main(void)
{
pFunc p1 = NULL;
char c = 0;
int a = 0, b = 0, result = 0;
result = p1(a,b);
}
int add(int a, int b)
{
return a + b;
}
(3)typedef与#define宏的区别:
typedef char *pChar; //typedef int *PINT; const PINT p2; 相当于是int *const p2;
//typedef int *PINT; PINT const p2; 相当于是int *const p2;
#define pChar char * //就是原地展开

3.二重指针和二重数组
(1)二重指针:
二重指针本质上也是指针变量,和普通指针的差别就是它指向的变量类型必须是个一重指针。二重指针其实也是一种数据类型,编译器在编译时会根据二重指针的数据类型来做静态类型检查,一旦发现运算时数据类型不匹配编译器就会报错。
二重指针就是:指针数组指针
(2)二维数组:
一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。二维数组a和一维数组b在内存使用效率、访问效率上是完全一样的(或者说差异是忽略不计的)。在某种情况下用二维数组而不用一维数组,原因在于二维数组好理解、代码好写、利于组织。
二维数组的两种访问方式:以int a[2][5]为例,(合适类型的)p = a;a[0][0]等同于((p+0)+0); a[i][j]等同于 ((p+i)+j)。

参考:http://www.zhulaoshi.org/

0 0
原创粉丝点击