无法转换' int [2] [4]'到' int **'在任务中

时间:2015-09-29 19:41:00

标签: c pointers

我正在尝试用指针做一些事情。我写了以下代码。

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int **p;

    int x[][4] = {{5,3,4,2},{5,3,4,2}} ;

    p = x;
    printf("%d\n", p);

    p++;
    printf("%d\n", p);
    return 0;
}

但我收到错误。 错误在线:

  

p = x;

我觉得我对指针很困惑。请帮帮我。

2 个答案:

答案 0 :(得分:2)

x拒绝输入int (*)[4]。因此使用:

int (*p)[4];

当然,改变

printf("%d\n", p);
适当地,例如:

printf("%d\n", p[0][0]);

<强>更新

鉴于x的声明,您可以使用:

int (*p)[4] = x;

int* p[] = {x[0], x[1]};

但你可能不会使用:

int** p = x;

答案 1 :(得分:0)

您犯的错误是:您知道可以像处理常量指针一样处理数组,这还意味着指向指针的指针与指针数组相似,并且也意味着指向数组的指针与常量数组相似。数组的数组。但是,指针数组在数组之间是不同的。 “您只能对最高级别的地址进行解释。”

如果您查看可以增加的东西的大小,这将变得更加清晰(请参阅以下内容:1.〜4.和2.〜3.,但不能是例如1.〜2。)。

从您的问题,答案和对答案的反应中,我认为总结一下所有奇怪的语法是适当的……

  1. int **p是一个整数指针,

    在内存中看起来像[address of int*]

    p ++将使p移动一个大小sizeof(int *),该大小是一个十六进制数字的大小,代表一个整数指针的存储位置。

  2. int (*x)[4]是一个指向int [4]实例的指针,即一个指向带有整数的大小为4的数组的指针。

    在内存中看起来像[address of int[4]]

    因此x ++会将x移动x的大小为sizeof(&(int [4])),这是用于寻址4个整数的数组的内存量

  3. int y[][4]是一个由4个整数组成的数组的数组,因此基本上y [1]将指向y ++指向的位置(如果您要声明为'int(* y)[ 4]”。

    [但是,您不能随便使用“ arraypointers”,因为它们被隐式声明为常量(int []〜int * const)。 ]

    在您的记忆中看起来像[address of int[4]][address of int[4]][address of int[4]]...

  4. int *z[4]是一个整数指针数组

    ,因此在内存中看起来像[address of int*][address of int*][address of int][address of int]。 z [1]将在位置z [0] + sizeof(int *)处给出te值。