我正在尝试用指针做一些事情。我写了以下代码。
#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;
我觉得我对指针很困惑。请帮帮我。
答案 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。)。
从您的问题,答案和对答案的反应中,我认为总结一下所有奇怪的语法是适当的……
int **p
是一个整数指针,
在内存中看起来像[address of int*]
。
p ++将使p移动一个大小sizeof(int *),该大小是一个十六进制数字的大小,代表一个整数指针的存储位置。
int (*x)[4]
是一个指向int [4]实例的指针,即一个指向带有整数的大小为4的数组的指针。
在内存中看起来像[address of int[4]]
。
因此x ++会将x移动x的大小为sizeof(&(int [4])),这是用于寻址4个整数的数组的内存量
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]]...
。
int *z[4]
是一个整数指针数组
,因此在内存中看起来像[address of int*][address of int*][address of int][address of int]
。 z [1]将在位置z [0] + sizeof(int *)处给出te值。