数组指针/指针数组/函数指针/函数指针数组

这里介绍的函数指针数组和数组指针/指针数组/函数指针/函数指针数组,今天小编带来了。

数组指针/指针数组/函数指针/函数指针数组

这里介绍的函数指针数组和数组指针/指针数组/函数指针/函数指针数组,今天小编带来了。

原文地址: 浅谈 数组指针 指针数组 函数指针 函数指针数组... 以及它们之间区别。

首先,先说明一个关系:数组和指针是没关系的!

数组名和指针的概念区别:

数组名和指针虽都代表数组首元素的地址,但意义不同。

网上有个举得比较好的例子,就是把它们分别比作省政府和市政府,数组名相当于省政府,指向首元素的指针代表市政府。如陕西的省政府在西安,而西安市的市政府也在西安,两个政府都在西安,但其代表的意义完全不同。

如下两种情况,它们不同的地方之处便体现了出来:

  • 如图:

    尤其注意

    ①(平时为了方便,省略了‘首’字),它和数组名取地址的结果相同都指同一个地方,但却是不同的类型(arr是int[3], &arr是int[3])*

    ②指向数组第一个元素的那个指针仅代表数组第一个元素(即 p <=> &arr[0],如下图)

    同时还有一个规律就是当指针和数组糅合在一起的时候,要判定到底是数组还是指针?

    看变量名最先和谁结合


    接下来说说它们糅合在一起的情况


    顾名思义,它是一个指针,是一个指向数组的一个指针。

    举例: int (*p)[4]; char (*p)[4]; 那 int *p[4]和int (*p)[4]有什么区别呢? 区别:由上面可知它们是指针,是指向一个大小为4个整型的数组的数组指针。这里*p[4],根据运算优先级,[]运算级高于* 而()操作符和[]优先级相等,从左向右进行运算,因此p先和()里的*结合,所以断定这是指针,然后再和[]结合,就成了数组指针。


    是一个数组,那是一个什么样的数组呢?是一个存放指针的数组。

    举例: int *p[10]; char *p[10]; char **p[10] ; 同上,这里不难看出,它们都是大小为10元素的数组,里面分别存放着元素为 int*,char*, char** 类型的指针数组

    这里有一道相关的 较经典的面试题,如下:


    #include<stdio.h> int main() { int a[5][5]; int(*p)[4]; p = a; printf("%d,%p\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); return 0; } 答案:-4 和 FFFFFFFC 这里画出内存图,解题思路就比较清晰了。定义的(*p)[4],p指向一个大小为4个整型的数组,所以将a的地址复制给p时,对p加1,实际是加上它所指向的类型大小,这里每加1就相当于一次加上4个int,于是乎我们就不难得出如上答案。 (ps:%p意思输出以地址格式输出,最后的FFFFFFFC是-4的补码)


    一看名字就知道这是指针,是一个存放函数地址的指针
    看以下代码…

    #include<stdio.h> void test() {   printf("hehe\n"); } int main() {   printf("%p\n", test);   printf("%p\n", &test);   return 0; } 结果:00A7107D 00A7107D 输出的是两个地址,这两个地址是 test 函数的地址。所以函数也是有地址的,那我们的函数的地址要想保存起来,怎么保存? 这里定义void (*p)()。一眼可知pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。 所以,就用指针变量p来保存test函数的地址了。


    把函数的地址存到一个数组中,那这个数组就叫函数指针数组,

    看下面三种定义,哪一个是函数指针的数组呢?

    int (*parr1[10])(); int *parr2[10](); int (*)() parr3[10]; 这里选择第一个,这里就定义了一个函数指针数组。 parr1 先和 [] 结合,说明parr1是数组,数组的内容是什么呢? 是 int (*)() 类型的函数指针。 用它来实现一个最简单的计算器了,如下: #include <stdio.h> int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a*b; } int div(int a, int b) { return a / b; } int main(){ int x, y; int input=0; int ret = 0; int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移 表 printf("选择操作(0~4):>") ; scanf("%d",&input); printf("输入2个操作数:>"); scanf("%d %d",&x,&y); ret = (*p[input])(x, y); //类似数组那样调用就可以了 printf( "ret = %d\n", ret); return 0; }

    指向函数指针数组的指针是一个 指针 ,指针指向一个 数组 ,数组的元素都是 函数指针

    void (*(*p)[ 5]) )( void) 这样的形式它表示 一个指向有5个元素 每个元素为指向一个返回值为空的函数 的数组的这样一个指针

    数组指针/指针数组/函数指针/函数指针数组的相关问答如下:

    提问:函数指针数组怎么声明

    回答:1、在定义函数指针数组之前,需要首先知道什么是函数指针.函数指针的定义形象点来说,就是用一个指针变量代替原函数中的函数名位置.2、在这儿需要特别提醒的是,定义函数指针时,括号一定不能缺少,因为 *pFun 是作为一个整体的.3、函数指针的调用方法与原函数基本一样,如图所示.

    提问:怎样定义函数指针数组

    回答:分析:函数指针数组是一个其元素是函数指针的数组.那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针.根据分析:首先说明是一个数组:数组名[]其次,要说明其元素的数据类型指针:*数组名[].再 次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明 表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组.有这样的函数数祖吗?不知道.所以必须括起来,以保证数组的每一个元素是指针.

    提问: 指针函数 函数指针 指针数组 数组指针 函数指针数组怎样去理解

    回答:指针数组: 一个数组,其每个元素都是指针 数组指针:一个指针,指向一个数组(一般把数组首地址赋给指针) 函数指针:一个指针,指向一个函数(一般把函数栈的首地址赋给指针) 指针函数: 一个函数, 返回值类型为指针 字符串指针:一个指针,指向一个字符串(一般是把字符串的首地址赋给指针) 告诉你理解的方法: 短语名词中 第二个名词是主体,前面的是修饰的.

    提问:c++中函数指针数组 怎么定义

    回答:int b[10] 这是10个大小的整型数组 int* b[10] 这是10个大小的整型指针数组 int (*b)[10] 这是指向上述第一种数组首地址的指针 int* (*b)[10] 这是指向上述第二种数组首地址的指针

    提问:指针数组函数的用法

    回答:1.如果是c语言.是不会出错的.c不对数组下标做强制检查.2.其实是一样的.可以指向.没学指针之前学的下标法却明确指出不能引用范围之外的.这只是说会有危险.引用或修改数组范围之外的内存单元往往会出现一些问题(尤其是修改,因为那些内存单元可能存放着一些重要的数据).但是就语法而言,下标法是引用范围之外的.这在语法上没错.只是很危险.给您举个例子.#include int main() { int a[8],b; a[10]=1; b=a[10];//虽然可以,但有时候会引起致命错误.千万别这样写.printf("%d",b); return 0; } ..

    提问:如何定义一个指向函数的指针数组

    回答:定义方法为:double add(double a,double b); double sub(double a,double b); double mul(double a,double b); double div1(double a,double b); double (*Func)(double,double); 参数个数,类型,返回值与所指向的函数一致,亦即这是定义了一个统配的类型.带函数指针的函数的定义方法:void printf(Func *f) { int a = 2; int b = 3; printf("%f",f(a,b)) }

    数组指针/指针数组/函数指针/函数指针数组的相关热门搜索词:

    函数指针数组,函数指针数组定义,函数指针数组用法,函数指针数组初始化,函数指针数组的定义形式和取值执行,函数指针数组调用,函数指针数组怎么定义,函数指针数组赋值,函数指针数组作为函数参数,

    标题:数组指针/指针数组/函数指针/函数指针数组|http://www.wc10086.cn/455744.html

    本文来自网络,不代表本站立场,转载请注明出处!