指针数组,数组指针,函数指针,函数指针数组,指向函数指针数组的指针

指针 数组
保存数据的地址,任何存入指针变量 p 的数据都会被当作地址来处理。p 本身的地址由编译器另外存储,存储在哪里,我们并不知道 保存数据,数组名 a 代表的是数组首元素的首地址而不是数组的首地址。&a 才是整个数组的首地址。a 本身的地址由编译器另外存储,存储在那里并不知道
间接访问数据,首先取得指针变量 p 的内容,把它作为地址,然后从这个地址提取数据或向这个地址写入数据。指针可以以指针的形式访问*(p+i);也可以以下标的形式访问 p[i]。但其本质都是先取 p 的内容然后加上i*sizeof(类型)个 byte 作为数据的真正地址 直接访问数据,数组名 a 是整个数组的名字,数组内每个元素并没有名字。只能通过“具名+匿名”的方式来访问其某个元素,不能把数组当一个整体来进行读写操作。数组可以以指针的形式访问*(a+i);也可以以下标的形式访问 a[i]。但其本质都是 a 所代表的数组首元素的首地址加上 i*sizeof(类型)个 byte 作为数据的真正地址。
通常用于动态数据结构 通常用于存储固定数目且数据类型相同的元素。
相关的函数为 malloc 和 free。 隐式分配和删除
通常指向匿名数据(当然也可指向具名数据) 自身即为数组名

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。

数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

A),int *p1[10];

B),int (*p2)[10];

“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,A是一个数组,其包含 10 个指向 int 类型数据的指针,即指针数组。

“()”的优先级比“[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。 p2 是一个指针,它指向一个包含 10 个 int 类型数据的数组,即数组指针。

函数指针

函数指针就是函数的指针。它是一个指针,指向一个函数。

看例子:

A),char * (*fun1)(char * p1,char * p2);

B),char * *fun2(char * p1,char * p2);

C),char * fun3(char * p1,char * p2);

看看上面三个表达式分别是什么意思?

C):fun3 是函数名,p1,p2 是参数,其类型为 char *型,函数的返回值为 char *类型。

B):与 C)表达式相比,唯一不同的就是函数的返回值类型为 char**,是个二级指针。

A):这里 fun1 不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。

函数指针的使用:

char * fun(char * p1,char * p2)

{

int i = 0;

i = strcmp(p1,p2);

if (0 == i)

{

return p1;

}

else

{

return p2;

}

}

int main()

{

char * (*pf)(char * p1,char * p2);

pf = &fun;

(*pf) ("aa","bb");

return 0;

}

函数指针数组

char * (*pf[3])(char * p);

这是定义一个函数指针数组。它是一个数组,数组名为 pf,数组内存储了 3 个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。

char * fun1(char * p)

{

printf("%s\n",p);

return p;

}

char * fun2(char * p)

{

printf("%s\n",p);

return p;

}

char * fun3(char * p)

{

printf("%s\n",p);

return p;

}

int main()

{

char * (*pf[3])(char * p);

pf[0] = fun1; // 可以直接用函数名

pf[1] = &fun2; // 可以用函数名加上取地址符

pf[2] = &fun3;

pf[0]("fun1");

pf[0]("fun2");

pf[0]("fun3");

return 0;

}

函数指针数组的指针

 char * (*(*pf)[3])(char * p);

函数指针数组指针就是一个指针。这个指针指向一个数组,这个数组里面存的都是指向函数的指针。

char * fun1(char * p)

{

printf("%s\n",p);

return p;

}

char * fun2(char * p)

{

printf("%s\n",p);

return p;

}

char * fun3(char * p)

{

printf("%s\n",p);

return p;

}

int main()

{

char * (*a[3])(char * p);

char * (*(*pf)[3])(char * p);

pf = &a;

a[0] = fun1;

a[1] = &fun2;

a[2] = &fun3;

pf[0][0]("fun1");

pf[0][1]("fun2");

pf[0][2]("fun3");

return 0;

}







猜你喜欢

转载自blog.csdn.net/lxb18821659801/article/details/80451731
今日推荐