函数指针数组,C语言中的指针数组是什么意思我对这个概念很混乱指针数组
来源:整理 编辑:智能门户 2023-08-19 02:13:17
本文目录一览
1,C语言中的指针数组是什么意思我对这个概念很混乱指针数组
指针数组:就是存储指针的数组。数组指针:就是指向数组的指针。指针:本质就是一个int型变量,含义:一个内存地址。举例:int *p[10] 指针数组。原因:因为[的优先级比*高,p先和[结合,所以是指针数组。等同于int* p[10].int (*p)[10] 声明了一个指针P,指向有10个元素的数组。如果 int* p;就是声明了一个指向int变量的指针P。同理。int (*p)[10] 声明一个指向int[10]的数组。指针数组,首先他是一个数组,里面存放的是指针。他的作用主要是用于数组每个元素的大小不同的时候,比如你要用一个数组存放很多人的名字(拼音),但是每个人的名字长度不一样,如果你定义二维数组,就会浪费内存空间。为了节约内存空间,你可以定义指针数组,一个数组里面存放一个char *指针,每个指针指向一个存放名字的内存空间就可以了。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越 在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后
2,C语言的 下述函数中定义一个指向函数的指针数组并循环接受一个整数
这是一个指向“函数指针”的问题。C语言定义的函数,通常是 :返回值类型 函数名(参数)函数指针的定义:int (*ptr)();函数指针数组的定义:int (*ptr[])();解释: double ( (1) )= 明显是函数指针数组的定义方式,因此应采用int (*ptr[])();方式填写,由于是三角函数,因此需一个参数,且类型是double:double ( *ptr[3](double) )=根据 if(x<1||x>3) ,x 的取值范围为1,2,3;而在C中数组是从0开始的,因此, 采用(*pt[x-1])(0.5) 是对的。朋友,请问你这是何用意呢?你给了问题,又给了答案,那么你想知道什么呢?你没有说啊!#includestdio.hfloat ave(int *a, int n) int *p = a; float s = 0; while(p a + n) s += *p++; return s / n;}int main() int i, a[10]; printf("输入10个整数:\n"); for(i = 0; i 10; i++) scanf("%d", a[i]); printf("平均值是%f\n", ave(a, 10)); return 0;}
3,如何定义一个指向函数的指针数组
这个用typedef可以完成: 先定义一个函数指针的类型:typedef void (*pFUN)(); 然后用这个类型pFUN定义一个数组 pFUN ptr[5];//[]里的数字是数组元素的个数,依情况而定:这儿用5做例子 这样ptr就是一个指向函数指针的数组。 对于“把一个指针强制定义”这我还没听过这个说法,只听过把指针强制转换成某个类型的指针: 强制类型转换用()运算,仍然用上面的定义类型。 例如: void *p;//p是一个void指针 pFUN ptr;//ptr是一个指向void函数的指针 ptr=(pFUN)p;//把p强制转换成指向void函数的指针,然后就可以把它赋值给ptr指针。 不用typedef也可以,只要合并就可以了: void (*ptr[5])();//这样ptr就是一个函数指针数组了.这样看很费解的!不如用typedef。对于强制类型转换最好还是用typedef,那样可读性好。 而且个人认为指针没有那种基本类型(指向函数的指针类型),那是一种新的类型。所以要先定义那种类型才行。 用typedef定义新类型又没有什么副作用,而且容易读懂,何必非要不用typedef呢?!没必要把简单的问题复杂化!!程序代码的可读性是很重要的,写复杂的类型而不用typedef是很令人反感的!假设指向数组的指针所指向的数组是:int a[m][n] //m、n都是符号常量函数返回一个指向数组的指针,则可以这样定义:int (*)[n] func(int a[][],其他形参) //函数返回值类型为int (*)[n] int (*p)[n]; p=a; //数组指针指向a ...... return p;}定义方法为: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))}"函数的返回值是void或者 其他类型"说明函数指针的类型不同如果数组中的元素类型不相同,那还叫数组吗?typedef void (*pfFunction)();pfFunction a[];(pfFunction)P ,把P强制转换成函数指针
4,数组指针指针数组区别要详细超详细我区分了好多次了还是
1、在c和c++中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示)。2、指针数组是指一个数组中的每个元素都是一个指针,也就是多维数组。说白了,数组指针就是指指向数组首地址的指针,也可以说是数组的首地址。而指针数组,按字面意思,指针的数组,存放指针的数组,也就是数组中每一个元素都是指针,即多维数组。 总而言之,数组指针是指一个指针,而指针数组是一个多维数组。 例子:int a[3][4];int (*p)[4];int *p[3]第一个,是指针数组,a[3][4]可以看成是存放三个指针的数组a[3],且每个指针指向一个存放4个整型数据的数组。第二个,int (*p)[4];这个和第一个例子的表达的意思一模一样,我们可以这样赋值:int (*p)[4]=a;其中p表示指向存放4个整型数据数组的指针,不过它没有给出指针的具体定义,所以我们还可以用这样赋值来理解:若int b[n][4];(n为int数据)则int (*p)[4]=b;(p也是指向一个存放4个整型数的数组,但这里有n个p指针!)。第三个,int *p[3];它定义了一组存放三个指针的整型数组,我们可以近似地理解:如int *q;(定义了一个q指针);int *p[3];(定义了一组指针)。(这一组指针的定义等同于这样三个指针的定义:int *x,*y,*z。)int a[3][4]这个无需多说,就是一个二维数组。int (*p)[4]就相当于int p[][4],它就是一个二维数组的指针,可以指向一个第二维度为4的二维数组。而a就是这样的数组,因而下面是合法的。p=a;int *p[3]是指针数组。说白了,就是定义了三个指针,分别为p[0],p[1],p[2]。可以将他们单独拿来使用。int a1,a2,a3;p[0]=&a1;p[1]=&a2;p[2]=&a3;指针数组,array of pointers数组指针 a pointer to array看看英文名字就知道了,中文翻译真的害死人。。。。int a[3][4]; 这个不用多说一个二维数组。int (*p)[4];这个是指向数组的指针,就是说定义了一个 p 指针变量,它是指向int型数组的。 可以让p指向a, p=a;他就是一个指针变量。用法你还是自己试试才能明白。int *p[3];这个肯定就是一个数组了,就像int p[3],只不过他是int 指针类型了, 也就是说p[0],p[1],p[2] 只能放一个地址。你在慢慢体会一下,明白就自己在编程试试就知道了。--------------指针---------------- int a=10; int *p=&a; -------------指针的指针----------- int b=20; int *p=&b; int **p2p=&p; -------------简单数组----------------- int c[10];//整数数组,含有10个整数元素 也就是说每一个元素都是整数 --------------指针数组-------------------- int *p[10];//指针数组,含有10个指针元素 也就是说每一个元素都是指针 --------------数组指针-------------------- int (*p)[10];//数组指针,这个指针能够用来指向 含有10个元素的整数数组 ------------函数指针--------------------- int (*p)( ); // 指向函数的指针...这里声明了一个指针p,该指针指向返回值是整型(即函数类型为整型)的函数! ----------------指针函数--------------------------- int *p(int a,float b); //返回值为指针的函数...该函数返回指向整型变量的指针! 即该函数的类型为int *, p和上例不同,他是函数名!上例中是指针!数组指针--指向数组的指针,是一个指针,其指向的类型是数组;指针数组--元素为指针的数组,是一个数组,其中的元素为指针。
文章TAG:
函数 函数指针 指针数组 数组 函数指针数组