33,311
社区成员
发帖
与我相关
我的任务
分享
template<class T>
struct A
{
T data;
}
typedef A<T> * pA
int *(*a[5])(int, char*);
void (*b[10]) (void (*)());
double(*)() (*pa)[9];
typedef double(* Function)(); //这里定义了一个名为Function的函数指针类型,以double为返回值类型 ,无参数
typedef Function (*FunctionArrayPointer)[9];
//定义一个指向一维数组的指针类型, 该数组的元素类型为Function
int main()
{
Function FunctionArray[1][9] ;//这里定义了Function的二维数组
FunctionArrayPointer pArray = FunctionArray ;
//但FunctionArrayPointer不是一维数组的指针吗?
//答:请仔细复习“行指针”知识,我几句话说不清楚。FunctionArrayPointer是个行指针。
}
还有,关于您说的越界是什么意思?
烦请解答。
答:我前面已经说了,你在内存中申请了N个字节,使用时超出了这N个字节就是越界了。
这是一方面。还有一种是你定义了一个数组,比如a[5] ;你使用了a[5]甚至a[6]也是越界了,会破坏邻接变量。
[/quote]
(1)int *(*a[5])(int, char*)
写成这样应该好理解些:int* (*a[5])(int, char*)
其中左边的int*和右边的(int, char*)共同说明了一个函数类型,即参数类型为int和char*返回类型为int*的函数类型,再看中间的(*a[5]),这个表明它是元素个数为5的数组,所以连起来:
typedef int *(*a[5])(int, char*);
a array;//这里就是定义了一个数组array,这个数组中有5个元素,每一个都是一个函数指针,
//且函数的参数类型为int和char*,返回类型为int*
(2)
void (*b[10]) (void (*)());
与(1)类似,左边的void和右边(void (*)())共同说明了一个函数类型,这种函数无返回值且参数是一个函数指针,这个函数指针指向的函数是一个无返回值且无参数的函数,中间的(*b[10])表示它是一个元素个数为10的数组,所以连起来:
typedef void (*b[10]) (void (*)());
b array;//这里就是定义了一个数组array,这个数组中有10个元素,每一个都是一个函数指针,
//且函数无参数无返回值
注意,这里的void (*)()虽然在C++中理解成上述无参数无返回值的函数指针,但是在C中却可以是带任意参数无返回值的函数指针,且C语言标准保证函数指针解引用时参数的正确接收
(3)double(*)() (*pa)[9]
左边的double(*)()说明了一个函数类型,此函数无参数且返回值为double类型,右边的(*pa)[9]说明它是一个指针,这个指针指向一个含有9个元素的数组,所以连起来:
typedef double (*pFun)();
typedef pFun (*pa)[9];
pa p = NULL;//这里定义了一个指针,它需要指向一个数组,这个数组要含有9个元素,
//且每个元素都是一个函数指针,函数无参数,返回值为double类型
template<class T>
struct A
{
T data;
}
template<class T>
using pA = A<T> *;
//那么实例化是这样吗?
pA<int> pInt = new A<int>;//这样VS报错
2.
关于这一句:a=(pa)malloc(sizeof(dfp));
pa是指向dfp的指针的数组吗?
如果是,那么malloc(sizeof(dfp))不是申请了一个dfp的内存空间(即4byte)吗?
那么为什么可以强制转换成pa,即9*4个dfp的空间?
int main()
{
pa a;
a=(pa)malloc(sizeof(dfp));
a[0][0]=f;
a[0][3]=g;
a[0][0]();
a[0][3]();
return 0;
}
上述代码中a为什么是二维数组?
typedef dfp (*pa)[9]; 这里是第二维的9,那第一维是什么时候定义的。
理解能力有限,希望能更进一步说明~谢谢[/quote]
问题一:我已经说过了,VS下对C++11更新过慢,所以不一定有这个功能,你看看VS2013有没有这个功能,没有就没办法了。目前gcc下已经除了最小垃圾回收,其他的功能都已经支持了,你可以去试一下。不过具体怎么样用我没做测试,是否这样子我也不太清楚,你可以去查查标准。
问题二,其实这里是有点问题的,我其实想表达的是指向一维的行指针,但是因为一下子找不到这个类型,所以就用其他指针代替了,因为指针的大小都是一样的。至于为什么可以转成9*4byte,你理解可能有问题了。我申请的是第一维的,但这里的9*4是第二维的,这两者无关。
我是认为typedef dfp (*pa)[9]; 已经确定了第二维是 9*4 Byte了,所以只需要申请一维空间就可以了,但后面的高手说是有问题的,属于越界。不过我也觉得只申请一维的话就直接使用二维还是有问题的,最好不要这样使用。看看下面的写法吧。a=(pa)malloc(sizeof(pa));
cout<<sizeof(a)<<endl;
cout<<sizeof(a[0])<<endl;
输出的是4和36,也就是说a的范围是a[0][0]-a[0][8]一共9个是没问题。a[0]的大小已经确定了。[/quote]
是你对越界的理解错误了。
你在内存中申请了N个字节,使用时超出了这N个字节就是越界了。
就算你这样写a=(pa)malloc(0); (完全没有分配内存),
或者把a=(pa)malloc(sizeof(dfp));完全去掉,
cout<<sizeof(a)<<endl;
cout<<sizeof(a[0])<<endl;
输出的还是4和36,因为那是从语义上的得到的,与实际内存无关。
template<class T>
struct A
{
T data;
}
template<class T>
using pA = A<T> *;
//那么实例化是这样吗?
pA<int> pInt = new A<int>;//这样VS报错
2.
关于这一句:a=(pa)malloc(sizeof(dfp));
pa是指向dfp的指针的数组吗?
如果是,那么malloc(sizeof(dfp))不是申请了一个dfp的内存空间(即4byte)吗?
那么为什么可以强制转换成pa,即9*4个dfp的空间?
int main()
{
pa a;
a=(pa)malloc(sizeof(dfp));
a[0][0]=f;
a[0][3]=g;
a[0][0]();
a[0][3]();
return 0;
}
上述代码中a为什么是二维数组?
typedef dfp (*pa)[9]; 这里是第二维的9,那第一维是什么时候定义的。
理解能力有限,希望能更进一步说明~谢谢
typedef double(* Function)(); //这里定义了一个名为Function的函数指针类型,其以double *
//为返回值且以void为参数
typedef Function (*FunctionArrayPointer)[9]; //定义了一个Function指针数组,数组容量为9,类型为
//Function的指针?
以上理解有错误吗?
int main()
{
Function FunctionArray[1][9] ;//这里定义了Function的二维数组
FunctionArrayPointer pArray = FunctionArray ;//但FunctionArrayPointer不是一维数组的指针吗?
pArray[0][0]=f;
pArray[0][1]=g;
pArray[0][0]( );
pArray[0][1]( );
return 0;
}
还有,关于您说的越界是什么意思?
烦请解答。
a=(pa)malloc(sizeof(pa));
cout<<sizeof(a)<<endl;
cout<<sizeof(a[0])<<endl;
输出的是4和36,也就是说a的范围是a[0][0]-a[0][8]一共9个是没问题。a[0]的大小已经确定了。a=(pa)malloc(sizeof(pa));
cout<<sizeof(a)<<endl;
cout<<sizeof(a[0])<<endl;
输出的是4和36,也就是说a的范围是a[0][0]-a[0][8]一共9个是没问题。a[0]的大小已经确定了。[/quote]
是你对越界的理解错误了。
你在内存中申请了N个字节,使用时超出了这N个字节就是越界了。
就算你这样写a=(pa)malloc(0); (完全没有分配内存),
或者把a=(pa)malloc(sizeof(dfp));完全去掉,
cout<<sizeof(a)<<endl;
cout<<sizeof(a[0])<<endl;
输出的还是4和36,因为那是从语义上的得到的,与实际内存无关。[/quote]
好吧,我会注意的。#include<iostream>
#include <vector>
typedef double(* dfp)();
typedef dfp (*pa)[9];
double f(){
cout<<" ff "<<endl;
return 1.1;
}
double g(){
cout<<" gg "<<endl;
return 1.1;
}
int main()
{
pa a;
a=(pa)malloc(sizeof(dfp));
a[0][0]=f;
a[0][3]=g;
a[0][0]();
a[0][3]();
return 0;
}
template <class T>
using My_vec = std::vector<T>;
VS2012好像还没支持这功能,gcc下未测试,有待验证。
问题二:都是函数指针而已,第一个是函数指针数组。第二个一样是函数指针数组,只是这些函数的参数也是函数指针。第三个是函数指针的二维数组。以第一个为例:#include<iostream>
#include <vector>
using namespace std;
typedef int *(*a[5])(int, char*);
int * f(int i,char* ch){
cout<<i<<" ff "<<ch<<endl;
int * p = (int*)malloc(sizeof(int));
return p;
}
int * g(int i,char* ch){
cout<<i<<" gg "<<ch<<endl;
int * p = (int*)malloc(sizeof(int));
return p;
}
int main()
{
a p={f,g};
int* p1 = p[0](1,"1");
int* p2 = p[1](2,"2");
return 0;
}