C
在c中可以这样:
int **p;p=(int **)malloc(100* sizeof p);//sizeof p是一个指针的大小
*(p+1)=(int *)malloc(10000*sizeof int);
*(p+2)=(int *)malloc(90*sizeof int);
另外关于p++会移动多少:
char**p1 = (unsigned char**) malloc(4*sizeof(p1));
printf("+0 %p\n",p1);
printf("+1 %p\n",p1+1);
printf("+2 %p\n",p1+2);
char* p2 = (char*)malloc(50);
printf("+0 %p\n",p2);
printf("+1 %p\n",p2+1);
printf("+2 %p\n",p2+2);
result:
+0 0x9040078
+1 0x904007c
+2 0x9040080
+0 0x9040090
+1 0x9040091
+2 0x9040092
指针变量本身永远都是4bytes但是指针却有类型之分,就在于这种用法机制:指针变量+1结果是指针所存地址+指向的变量的类型的size。
本例中p2指向空间存的是以char为单位的数据,所以该指针+1地址就+1;
而p1指向空间存的是指针(虽然p1是char**,不要被迷惑哦)是以4为长度单位,所以该指针+1地址就+4。
指针 p+n 约等于(非等价于,区别在于:p+n仍然是一个地址,p[n]则变成了 *(p+n),反正都是一些语法规则而已)p[n]所以有以下情况:
Struct buffer
{
void* start;
unsigned intlength;
}*buffers;
buffers =(buffer*)calloc (req.count, sizeof (*buffers));
for(int n = 0;n<req.count;n++)
{
buffers[n].length= buf.length;
}
这里buffers只是一个buffer类的指针(实际上是一个地址而已),所有可以有1:buffers->length= ...;和2:buffers[n].length = ...;两种用法。就像char *指向的地方可以是一个char也可以是一个字符串一样。
C++
1, int arr[4][5];这个是静态直接建立 内存连续
2,int (*arr)[5]=new int[4][5];
动态分配 内存连续
3,int *arr[4];
静态指针数组法,它是由指向一系列内存的指针组成,
所指向的内存不一定连续
如:
int *p[4];
p[1]=new int[5];
p[2]=new int[100];
if(p[1]&&p[2])
{
p[1][4]=0;
p[2][88]=999;
cout<<p[1][4]<<endl<<p[2][88]<<endl;
}
4,int **p;
动态二级指针法
它指向的数组的多少可变,指向内存大小可变,
内存可以不连续,但可以以连续的方式访问
比如:
int **p;
p=new int *[100]; //指针数组的大小
*(p+1)=new int [10000];//第二个指针指向的内存大小。
//也可以是这样:p[1]=new int [10000];
p[2]=new int [90];//第三个指针指向的内存大小。
if(p[1]&&p[2])
{
p[1][4]=0;
p[2][88]=999;
cout<<p[1][4]<<endl<<p[2][88]<<endl;
}