一血初学者,有三个选择题,请大侠们给作一个

一血菜鸟,有三个选择题,请大侠们给作一个。
一个函数声名为void   foo(char   **p,int   len)该函数的功能是分配大小为len的内存

空间给指针p,那么这个函数中内存分配语句应该是

void   foo(char   **p,int   len)
{
______________
}为什么?
1,p=malloc(len)
2,p=(char   *)   malloc(len)
3,**p=(char   *)malloc(len)
4,*p=(char   *)malloc(len)
如果程序中需要分配大小为100byte的内存空间给char   *ptr,那么调用上面的函数

应该是();为什么?
1,foo(ptr,100);
2,   foo(&ptr,100);
3,foo(*ptr,100);
4,foo(**ptr,100);
若有以下程序,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是()为什么;
int   t[3][3],*pt[3],k;
for(k=0;k <3;k++)pt[k]=&t[k][0];
A,t[2][0]   B,t[2][2]   C,t[1][2]   D,t[2][1]


------解决方案--------------------
1 4 //分配的内存要由一个指针来指向,所以从34中选,其中3是指向指针的指针
2 2 //函数原型中形参为指针的指针,只要将指针变量再取地址,即可作为实参
3 c //pt+1,指针移动一行, *(pt+1)+2中的加2指针移动2列