1 c语言的优先级规则:
A 声明从它的名字开始读取,然后按照优先级顺序依次读取
B 优先级从高到低依次是:
B.1 声明中被括号括起来的那部分
B.2 后缀操作符:
括号()表示这是一个函数,
方括号[] 表示这是一个数组
B.3 前缀操作符:星号*表示“指向…的指针”
C 如果const和/或volatile关键字的后面紧跟类型说明符(如int、long等),那么它作用于类型说明符。在其它情况下,const和/或volatile关键字作用于他左边紧邻的指针星号。
例子1
char * const *(*next)();
next是一个指向函数的指针,该指针返回另一个指针,返回的指针指向一个只读的指向char指针
例子2
char *(*c[10])(int **p);
c是一个数组[0…9],它的元素类型是函数指针,其所指向的函数的返回值是一个指向char的指针
2 声明和定义的区别:
定义——为对象(变量或函数)分配内存,只能出现一次 。如 int array[100];
声明——所说明的并非本身,而是描述其他地方的创建的对象,可以多次出现。如extern int array[];
3 指针和数组的区别:
- 指针——保存数据的地址;数组——保存数据
- 指针——间接访问数据。首先取得指针的内容,把它作为地址,然后从这个地址提取数据。如果指针有一个下标[i],就把指针的内容加上I作为地址,从中提取数据;
【 例子:char *p = “abcdefgh”; c=p[i];
编译器符号表具有一个p,地址为4624。
1 取地址4624的内容,即’5081‘;
2 取得i的值,与5081相加;
3 取地址[5081+i]的内容。】
数组——直接访问数据。a[I]只是简单的以a+I为地址取得数据 - 指针——动态数据结构;数组——存储固定数目且数据类型相同的元素
- 指针——malloc/free;数组——隐式分配和删除
- 指针——指向匿名函数;数组——自身为数据名
4 数组和指针可交换性的总结:
1、用a[i]这样的形式对数组进行访问总是被编译器”改写“或解释为像*(a+1)这样的指针访问。
2、指针始终是指针,绝不可能改写成数组。可以用下标形式访问指针,一般是指针作为函数参数时,而且知道实际传递给函数的是一个数组。
3、仅在作为函数的参数时,一个数组的声明可以看作是一个指针。作为函数参数的数组(在调用中)始终会被编译器修改成为指向数组第一个元素的指针。
4、当把一个数组定义为函数的参数时,可以选择把它定义为数组,也可以定义为指针。不管哪种方法,在函数内部事实上获得的都是一个指针。
5、在其他所有情况中,定义和声明必须匹配。如果定义了一个数组,在其它文件对他进行声明时也必须把它声明为数组;指针也是如此。
例子:
函数定义
func(int * tunip){…}
func(int tunip[]){…}
func(int tunip[200]){…}
数据定义
int int_1;
int *int_ptr;
int int_array[10];
数组/指针实参的一般用法
调用时的实参 -------------- 类型 ------------------------------------ 通常目的
func(&int_1); --------------- 一个整型数的地址 ------------------- 一个int参数的传址调用
func(int_ptr); ---------------- 指向整型数的指针 ------------------ 传递一个指针
func(int_array); ------------- 整型数组 ------------------------------ 传递一个数组
func(int_array[i]); ----------- 一个整型数组某个元素的地-------传递数组的一部分