Arrays 指针数组和二维数组之间的差异

Arrays 指针数组和二维数组之间的差异,arrays,pointers,multidimensional-array,Arrays,Pointers,Multidimensional Array,以下哪项在尝试打印值时会出现错误?为什么?(假设n[10][10]被正确初始化) (注:请详细解释)当您尝试创建这些内容时,编译器不会抱怨,但您可能无法获得预期的打印输出值 int*m[10]正在创建一个包含10个指向int的指针的数组。这可能指向10个不同的整数,或者(正如我猜想的那样)它可能指向10个整数的“数组”。这里的问题是上下文(通常在C中);我们不知道你到底想做什么。int*指向保存int的内存位置。这可能是一个int,也可能是一个int数组。您的代码没有任何其他设置信息-不是mal

以下哪项在尝试打印值时会出现错误?为什么?(假设n[10][10]被正确初始化)


(注:请详细解释)

当您尝试创建这些内容时,编译器不会抱怨,但您可能无法获得预期的打印输出值

int*m[10]
正在创建一个包含10个指向int的指针的数组。这可能指向10个不同的整数,或者(正如我猜想的那样)它可能指向10个整数的“数组”。这里的问题是上下文(通常在C中);我们不知道你到底想做什么。
int*
指向保存
int
的内存位置。这可能是一个
int
,也可能是一个
int
数组。您的代码没有任何其他设置信息-不是malloc'ing或设置等于int地址的指针-因此我们不知道。当您打印出来时,我们不知道您可能会得到什么,因为内存似乎还没有创建(根据我们在这里看到的代码)

n[10][10]将(在大多数系统上)自动设置为初始化为0的10x10阵列,但我们不能指望这一点。不管怎样,我们不知道要打印什么。如果使用
printf
打印,则可以打印n[2]保存的内存地址值。可能不是你想要的。如果不将其作为指针打印出来,而是使用
printf
的%d修饰符,编译器可能会显示警告,但会允许它。打印出的内容将被解释为整数的地址。可能也不是你想要的

打印m[3]与打印int还是指针的n[2]问题相同。然而,(可能)与n不同的是,m的内存(从代码中)似乎永远不会被设置。它可能(在大多数系统上)打印出一个0,因为默认情况下它可能被设置为空指针。再说一次,我不知道我们能指望这一点


人们经常被教导使用C有多种方法来做事情——这是真的。但他们通常不被教导的是,做大多数事情都有一个合适的环境,或者什么时候使用一种或另一种方法。在很大程度上,上下文是由我们是使用编译时还是运行时分配的内存来定义的。在真正理解差异之前,您需要阅读C语言中的内存管理,并进一步了解堆栈和堆的用途

您需要添加更多信息;你是想打印出这些索引中的值,给它们设置一些值,还是怎么做?您是否正在创建m中的任何指针指向的任何其他内存?只是没有提供足够的信息。我正在尝试打印这些值。
int *m[10], n[10][10];
int a[] = {1,2,3,4,5,6,7,8,9,10};
m[4] = a;
1) m[2][4]
2) n[2]
3) m[3]