指针数组和二维数组之间的区别

时间:2018-10-01 02:34:01

标签: arrays pointers multidimensional-array

int *m[10], n[10][10];
int a[] = {1,2,3,4,5,6,7,8,9,10};
m[4] = a;

以下哪项在尝试打印值时会出错,为什么? (假设即使n [10] [10]也要适当初始化)

1) m[2][4]
2) n[2]
3) m[3]

(PS:请详细说明)

1 个答案:

答案 0 :(得分:1)

当您尝试创建所有这些东西时,编译器不会抱怨,但是您可能不会获得期望的打印输出值。

int *m[10]正在创建一个由10个指向整数的指针的数组。这可能指向10个不同的整数,或者(正如我怀疑的那样,它可能指向10个“数组”的整数)。这里的问题是上下文(通常在C语言中);我们不完全知道您要做什么。 int*指向保存int的存储位置。这可能是单个int,也可能是ints的数组。您的代码没有任何其他设置信息-不分配或设置与int地址相等的指针-因此我们不知道。当您打印出来时,我们不知道会得到什么,因为似乎尚未创建内存(根据我们在此处看到的代码)。

在大多数系统上,n [10] [10]将自动设置为初始化为0的10x10数组-但是我们不能指望这一点。无论如何,我们不知道要打印什么。如果使用printf打印,则可以打印n [2]保留的内存地址的值。可能不是您想要的。如果不将其打印为指针,而是使用printf的%d修饰符,则编译器可能会显示警告,但会允许它。输出的内容将是一个解释为整数的地址。可能不是您想要的。

打印出m [3]与n [2]的问题相同,即打印出int还是指针。但是,(可能)与n m的内存不同(从您的代码)不会出现要进行设置。在大多数系统上,它可能会打印出0,因为默认情况下它可能设置为空指针。再说一次,我不知道我们可以指望这一点。

人们经常被教导,用C有多种做事的方法-的确如此。但是通常不教他们的是有适当的上下文来执行大多数操作,或者何时使用一种或另一种方法。在很大程度上,上下文是由我们使用编译时还是运行时分配的内存定义的。在真正理解它们之间的区别之前,您需要阅读有关C语言中的内存管理的知识,并详细了解Stack和Heap的用途。