c - 理解指针

标签 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 在上述正确情况下做了什么?

最佳答案

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(...);

关于c - 理解指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26038473/

相关文章:

c - 为什么使用严格一致的程序和一致的实现并不能保证绝对的可移植性?

c - 小棘手的程序输出

c - 在c中重新分配二维字符数组

c - 算术规则是否适用于 C 中的加法?

java - 在 c++/c 中使用 JAR 文件

c - 编译错误问题

c - 以下带有 malloc 的代码行是做什么的?

c - 需要解释 C 中 "puts"的输出

c - 如何使用指针处理存储在变量中的地址?

c - 如何释放结构体c中的双指针?