Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解指针_C_Pointers - Fatal编程技术网

C 理解指针

C 理解指针,c,pointers,C,Pointers,我是C语言的新手。我很难理解以下两种语言之间的区别 int N = 16 double (*XX)[2] = malloc(2*N*sizeof(double)); 及 如果我写第一个,它就会被编译。然而,第二个给出了以下错误。请解释一下 error: invalid initializer 编辑:我还想问一下,在上述正确的情况下,malloc在做什么? double (*XX)[2] double *XX[2] XX是指向2个双精度数组的指针 在这种情况下 double (*X

我是C语言的新手。我很难理解以下两种语言之间的区别

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

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

error: invalid initializer
编辑:我还想问一下,在上述正确的情况下,malloc在做什么?

 double (*XX)[2]
 double *XX[2]
XX是指向2个双精度数组的指针

在这种情况下

 double (*XX)[2]
 double *XX[2]
XX是指向双精度的2个指针的数组

编辑: 其他人已经解释了malloc,但是用外行的术语:使用malloc,您可以使用malloc在计算机上保留一定数量的内存,然后将值存储在使用malloc保留的内存中

  • malloc
    将返回指向某个内存位置的指针(
    void*
  • double(*XX)[2]
    是指向一个double数组的指针-没问题:编译器知道如何从
    void*
    转换到
    double*
  • double*XX[2]
    是一个双指针数组我更喜欢这样写
    double*XX[2]
    对我来说,理解我们所说的双指针更容易些)-编译器不知道从
    void*
    到双指针数组的转换
  • double(*XX)[2]
    是指向包含两个
    double
    元素的数组的指针


    double*XX[2]
    是指向包含两个
    double*
    元素的数组的指针

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

    char数组_堆栈[2];//堆栈上分配了2个字符(不需要free())
    char*array_heap=malloc(2*sizeof(char));//堆上分配的2个字符
    //后来。。。
    空闲(数组_堆);//堆内存必须由用户释放
    
    供参考:

    char数组_堆栈[2];//然而,这是一个指针
    char*array=array_stack;//这是可行的,因为数组_堆栈是指向字符的指针
    
    有关堆栈和堆的详细信息:

    double*XX[2]=malloc(2*N*sizeof(double));
    
    不起作用,因为它需要两个元素作为初始值设定项。例如:

    double\u1,u2;
    double*XX[2]={&_1,&_2};
    
    如果要使用malloc执行此操作,则需要将其更改为指向具有双指针的数组的指针,如下所示:

    double**XX=malloc(…);
    
    XX在第一种情况下只是一个指针,指向一个包含两个双元素的数组。所以“sizeof(XX)”只有4

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

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


    第二个(
    double*XX[2]
    )定义了一个数组。数组初始化器看起来像这样的
    ={}

    你能不能在我的问题中添加关于“malloc”在做什么的答案