理解指针

时间:2014-09-25 12:16:58

标签: c pointers

我是C的新手。我很难理解以下两者之间的差异

int N = 16
double (*XX)[2] = malloc(2*N*sizeof(double)); 

int N = 16
double *XX[2] = malloc(2*N*sizeof(double)); 

如果我写第一个,它就会被编译。但是,第二个是给出以下错误。请解释

error: invalid initializer

编辑:我还想问一下malloc在上面的正确情况下做了什么?

5 个答案:

答案 0 :(得分:2)

double (*XX)[2]是指向具有两个double元素的数组的指针。

double *XX[2]是指向具有两个double *元素的数组的指针。

malloc用于动态内存分配,例如:

char array_stack[2]; // 2 chars allocated on the stack (no need for free())
char *array_heap = malloc(2 * sizeof(char)); // 2 chars allocated on the heap
// later...
free(array_heap); // heap memory must be freed by user

供参考:

char array_stack[2]; // this is nevertheless a pointer
char *array = array_stack; // this works, because array_stack is a pointer to a char

有关堆栈和堆的更多信息:Stack vs Heap

double *XX[2] = malloc(2*N*sizeof(double)); 

不起作用,因为它期望两个元素作为初始化器。例如:

double _1, _2;
double *XX[2] = {&_1, &_2};

如果你想用malloc做这个,你需要把它改成指向一个带有双指针的数组的指针:

double **XX = malloc(...);

答案 1 :(得分:1)

在这种情况下

 double (*XX)[2]

XX是指向2个双打数组的指针

在这种情况下

 double *XX[2]

XX是两个指向双重

的数组

编辑: 其他人已经解释了malloc,但是用非专业术语来说:使用malloc,你可以使用malloc在你的计算机上预留一定数量的内存,然后将值存储在你用malloc预留的内存中

答案 2 :(得分:0)

  1. malloc将返回指向某个内存位置(void*)的指针。
  2. double (*XX)[2] 指向双精度数组的指针 - 没问题:编译器知道如何从void*投射到double*
  3. double *XX[2] 是一个双指针数组(我更喜欢这样写double* XX[2]对我来说,更容易理解我们在谈论 double指针) - 编译器不知道从void*双指针数组的转换

答案 3 :(得分:0)

第一种情况下的XX只是一个指向带有两个双元素的数组的指针。所以“sizeof(XX)”只有4个。

第二种情况: XX是一个数组名称,其中包含两个元素,其类型为(double *)。 所以下面的代码就可以了。     double * XX [2];     XX [1] = malloc(20 * sizeof(double));

答案 4 :(得分:0)

第一个定义double (*XX)[2]定义了一个值,这里是一个指针。单个变量可以由单个值初始化,由= malloc(...)返回。

第二个(double *XX[2])定义一个数组。数组初始化器看起来像= {<init value(s)>}