最近有点尿频女:关于指针大家来看看

来源:百度文库 编辑:高考问答 时间:2024/04/29 01:21:02
程序如下,最近点计算,程序记数单位正方形内随机生成的点对.
/* 点数据类型接口 point.h */

/*include <math.h>

typedef struct point {
float x; float y;
}point;
float distance(point a, point b)
{
float dx = a.x - b.x, dy = a.y - b.y;
return sqrt(dx*dx + dy*dy);
}
*/
#include <stdio.h>
#include <stdlib.h>
#include "point.h"
float randFloat()
{
return 1.0 * rand() / RAND_MAX;
}

int main(int argc, char *argv[])
{
float d = atof(argv[2]);
int i, j, cnt = 0, N = atoi(argv[1]);
point *a = malloc(N*sizeof(point));
//问题就在这,改成 point *a = malloc(N*sizeof(point*));
// 运行结果一样,为什么??这样声明a是什么?原来那样声明又是什么?
printf("%d", sizeof(point));
printf("%d", sizeof(point*));

for(i = 0; i < N; i++)
{
a[i].x = randFloat();
a[i].y = randFloat();
}
for(i = 0; i < N; i++)
for(j = i+1; j < N; j++)
if(distance(a[i], a[j]) < d) cnt++;
printf("%d edges shorter than %f\n", cnt, d);

system("pause");
return 0;
}

sizeof(point); 和sizeof(point*); 是得到()里类型的长度
如果输出这两个东西的大小也是一样的 那就说明point 和point* 占用存储空间相同,指针类型一般占4个字节,float 占4个字节,在这个问题中结构体里有两个float所以占8个字节,在乘以 N 的空间首地址赋给占四个字节的a
所以 这两个的不同在于
point *a = malloc(N*sizeof(point));
4个字节大小的指针a 指向 8*n 个大小的空间首地址
point *a = malloc(N*sizeof(point*));
4个字节大小的指针a 指向 4*n 个大小的空间首地址

point *a = malloc(N*sizeof(point));
在堆上分配N个point大小的空间
point *a = malloc(N*sizeof(point*));
在堆上分配N个point*大小的空间
编译当然是都能通过

我想这个问题恐怕要涉及到编译器如何解释sizeof(point*)。