开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
指针数组与数组指针
- 指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量;
- 数值指针的实质是一个指针,这个指针指向一个数组;
-
分析指针数组与数组指针的表达式一般规律:int *p;(p是一个指针); int p[5];(p是一个数组);
- (1) int *p[5]; (2) int (*p)[5]; (3) int *(p[5]);
-
- 总结:我们在定义一个符号时,关键在于:
- 第一步:找核心,首先要搞清楚定义的符号时谁;
- 第二步:找结合,看谁跟核心最近,谁跟核心结合;
- 第三步,继续向外找结合,直到符号完;
- 如果核心和 * 结合,表示核心是指针;
- 如果核心和 [] 结合,表示核心是数组;
- 如果核心和 () 结合,表示核心是函数;
- 使用一般规律分析3个符号:([] 的优先级高于 *)
- int *p[5]: p是一个数组,数组中的5个元素都是指针,指针指向int型,所以 *p[5] 是一个指针数组;
- int (*p)[5]: p是一个指针,指向一个数组,数组有5个元素都是int类型,所以 (*p)[5]是一个数组指针;
- int *(p[5]): 是一个指针数组,结合方式同第一个一样;
函数指针与typedef
- 函数指针的实质还是一个指针,还是指针变量。本身占4个字节(在32位系统中,所有的指针都是4个字节);
- 函数指针、指针数组、普通指针之间并没有本质的区别,区别在于:指针指向的东西是什么;
- 函数指针的实质是一段在内存中连续分布的代码,函数的第一句代码的地址,就是这个函数的地址;
- 结合函数的实质,函数指针其实就是一个普通的变量,这个普通的变量的类型是函数指针变量类型,他的值是
- 函数指针的书写和分析方法:
- C语言是一个强类型语言(每一个变量都有自己的变量类型),编译器可以帮我们做严格的类型检查;
- 所有的指针变量类型的本质是一样的,知识写法不一样,如:int型指针 *p ;数组指针 int (*p)[5];
- 假设有函数:void func(void); 对应的函数指针:void (p)(void); 类型是:void ()(void);
- 函数名和数组名最大的区别:函数名做右值时加不加 & ,效果和意思是一样的;但是数组名做右值时加不加 & 意义就不一样了。
- 写一个复杂的函数指针的示例:如函数strcpy: char *strcpy(char *dest, const char *src);对应的函数指针是: char *strcpy(char *pFunc)(char *dest, const char *src);
typedef关键字的用法
- typedef是C语言中的一个关键字,用来定义(或者叫重命名类型);
- C语言中的类型一共有2种:一种是编译器定义的原生类型(基础数据类型,如int、double之类的);第二种是用户自定义类型,不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型、函数类型·····);
- 数组指针、指针数组、函数指针等都属于用户自定义类型;
- 有时候自定义的类型太长了,使用不方便,就可以用typedef给他重命名一个短一点的名字;
- 注意:typedef是给类型重命名,也就是说,typedef定义出来的都是类型,而不是变量;