繁体   English   中英

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

[英]Difference between array of pointers and a 2-D 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:请详细说明)

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM