快到晚饭的时候,突然有个人在百度HI中问我这个int *(*(*ptr)[10])(int *)怎么理解,函数指针!!我就把自己的理解给其讲了一遍。也不知道自己理解的对不对,后来又有一个人问我一道题目,我询问了一下,原来19号考计算机二 级,都是二级的题目,这也忒难了吧!!!对于非计算机专业的人来说,绝对是折磨。
整理一下,写出来。
【题目1】int *(*(*ptr)[10])(int *)的含义。
对于开头的int *,这里是代表函数返回值的类型,返回值是int型的指针。
int *(*(*ptr)[10])(int *)中(*(*ptr)[10])这是个函数指针,函数名存放在(*ptr)[10]的数组中,而这个数组又是一个10个元素的整型数组,即这里ptr是一个整型指针变量,指向一个10元的整型数组。
int *(*(*ptr)[10])(int *)中最后的(int *),指的是函数参数为int型指针。
【题目2】struct st
-------------------{
------------------- int n;
------------------- int *m;
------------------- };
------------------- int a=7,b=3,c=5;
------------------- struct st s[3]={{101,&a},{102,&c},{103,&b}};
------------------- main()
------------------- {
------------------- struct st *p;
------------------- p=s;
------------------- printf("%d/n",*++p->m);// 这个答案为什么是3呢?
------------------- }
分析:*++p->m先是-> 然后++ 最后*
p->m是a的地址 即&a 然后做了次地址加一 指向&a的下一个 就是&b
然后*(++p->m)相当于*(&b) 也就是b的值
这样就是b的值 结果是3了
int **ptr 与 int ptr[4][4] 的区别???
可以啊最好这样理解。
你应该知道
*(*(ptr+1)+2);相当于ptr[1][2];
呵呵。
**p可以理解成*((*p+0)+0);相当于ptr[0][0];
区别在于:int **ptr定义了一个指针(具体的,二级指针),它使得编译程序使程序在运行时分配一点点内存用来存放这个指针——某个数值,它标明了内存中的某个位置; 而int ptr[4][4]定义了一个二维数组,它使得编译程序让程序在运行时在内存中分配sizeof(int)*4*4个字节用来存放数据。int **ptr中定义的ptr是一个变量,如果需要,你可以随时变换它的值——它也仅仅是一个值;而int ptr[4][4]中定义的ptr本身是一个常量.这个常量用来使编译器明白你所引用的是那个你已经为其分配过内存的数组,ptr这个引用的有效性依赖于 编译器,编译器会直接把它替换成某个常量——在运行时,根本没有任何内存空间来把这个值当作变量存放,它存在于代码中,是在连接时已经指定好的,一般的, 程序本身没有权利再去改变它。
一句话,int **ptr是一个可变的句柄,你可以让它指向任何你感兴趣的内容(一般的,你准备把这个内容当作一个二维数组看待),它并没有分配任何存放实际数据的空间 ——这也是它不必要指定大小的原因,而int ptr[4][4]是一个空间,当然,这个空间附送了你一个引用它的句柄,这个句柄既然是配合这个空间附送给你的,当然它值用于引用这个空间,所以它是不 可变得。
int (*ptr) ();是什么意思啊? ptr又是什么意思啊?
是一个函数指针
首先PTR与*结合,说明是一个指针,然后与()结合,说明该指针指向一个函数,然后与INT结合,说明函数的返回值为INT型,所以是一个指向 一个返回值为INT型的函数 的指针
大哥,指针函数应该是int *ptr();
#include
int max(int x,int y)
{
return(x>y?x:y);
}
void main()
{
int (*ptr)();
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数, 实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把 哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要 小心。
c语言:设int(*ptr)[5];则其中的ptr是()
a)5个指向整型变量的指针
b)指向5个整型变量的函数指针
c)具有5个指针元素的一维数组
d)一个指向具有5个指针元素的一维数组的指针
int a[] = {1,2,3,4,5,6}; 则int (*ptr) = a; int *p = a[0] 有什么区别
int (*ptr) 和int *p 本身是没有什么区别的,都是定义一个指针
只不过名字叫的不同而已,a表示数组的首地址,确切的说法应该是数组的第1个元素的地址,即在这里是a[0]的地址 .int *p = a[0]不能表达正确意思。
下面几个是等价的写法
int (*ptr)=a; //ptr指向第一个元素1
int *q=a; //q指向第一个元素1
int *p=&a[0]; //p指向第一个元素1
给个程序你验证下把
#include <iostream>
using namespace std;
void main()
{
int a[] = {1,2,3,4,5,6};
int (*ptr)=a; //ptr指向第一个元素1
int *q=a; //q指向第一个元素1
int *p=&a[0]; //p指向第一个元素1
//输出验证
cout<<(*ptr)<<endl;
cout<<*q<<endl;
cout<<*p<<endl;
}
解释一下 typedef int (*fn_ptr)(); (无内容)
typedef int (*funcptr)(); // funcptr is synonym for "pointer
// to function returning int"
funcptr table[10]; // Equivalent to "int (*table[10])();"
应该能看明白了吧?