1)sizeof()的使用:先来做两个简单的测试:
double* dbPointer=NULL;
double dbArray[10];
dbPointer=dbArray;//(double*)malloc(sizeof(double)*10);
fprintf(stderr,"Size of szPointer = %d.\n", sizeof(dbPointer));
fprintf(stderr,"Size of dbArray = %d.\n", sizeof(dbArray));
输出的结果分别为:4和80(32位机器).虽然在内存中dbPointer和dbArray都是80个字节的空间,但是就sizeof()函数来讲,对于数组来讲,返回该数组在内存中的空间大小(所以结果为80),所以一般可以利用sizeof(dbArray)/sizeof(dbArray[0])来得到该数组的长度;而对于指针,sizeof()则返回该指针的空间大小,在32位机器上,指针为4个字节表示,因此返回4.
2)数组名和指针:数组名代表数组中第一个元素的地址;对于多维数组来讲,数组名代表该数组第一维的第一个元素的地址:
double dbTestArray[20];
fprintf(stderr,"Address = %p.\n", dbTestArray);
fprintf(stderr,"Address = %p.\n", dbTestArray+1);
double dbTdTestArray[20][10];
fprintf(stderr,"Address = %p.\n", dbTdTestArray);
fprintf(stderr,"Address = %p.\n", dbTdTestArray+1);
fprintf(stderr,"sizeof = %d.\n", sizeof(dbTestArray));
fprintf(stderr,"sizeof = %d.\n", sizeof(dbTdTestArray));
fprintf(stderr,"sizeof = %d.\n", sizeof(*dbTestArray));
fprintf(stderr,"sizeof = %d.\n", sizeof(*dbTdTestArray));
输出的结果为:002DFB9C、002DFBA4、002DF554、002DF5A4、160、1600、8和80. 可以看到,对于一维数组来讲,指针指向了该数组中第一个元素的地址,并且此时指针指向的是数组元素;而对于二维数组来讲,虽然数组名也是指向了第一个元素(即dbTdArray[0]),但实际上这个元素也是个一维数组,因此对该数组执行加1操作时,地址变化了10个double类型的空间(80个字节),而不是8个;这点从后面的sizeof()操作的结果中也可以看出。
3)数组指针和指针数组:数组指针指的是指向数组的指针,这种指针一般只能指向具有一定大小的数组;而指针数组可以理解为“指针的数组”,是一系列指针的集合。
double dbTdTestArray[20][10];
double* pArrayPointer[10]; //指针数组
double (*pPointerArray)[10]; //数组指针,只能指向有10个元素的数组
pPointerArray=dbTdTestArray;
这种情况下,pPointerArray就是数组指针,它的意思是,我只能指向有10个元素的一维数组(注意,如果有个三维数组,a[10][20][10],那么pPointerArray=a不能通过编译,而pPointerArray=a[0]就能通过,想想为什么),记住在声明数组指针时,星号和变量名前后的括号不能省略,否则就会声明成指针数组了。