C/C++数组名与指针差异解析

需积分: 10 12 下载量 200 浏览量 更新于2024-08-07 收藏 1.84MB PDF 举报
"这篇文档主要讨论了C/C++编程中数组名与指针的关系,以及在函数调用约定中的特殊处理。文中指出,虽然数组名在某些情况下可以作为指针使用,但它们实际上是不同的概念。作者通过反证法证明数组名不是指针,并解释了为何数组名可以被赋值给指针的原因。此外,文档还提到了C/C++中的调用约定,特别是_cdecl协议下的参数处理方式,以及INTSIZEOF宏的作用。" 在C/C++编程中,数组名和指针常常被混淆,因为它们在语法上具有相似性。然而,数组名并不是指针,尽管它们在某些操作中可以互换使用。数组名实际上是一个常量指针,它总是指向数组的第一个元素的地址。在示例程序中,`char str[10]`声明了一个包含10个字符的数组,`sizeof(str)`返回数组的总大小,即10个字符(通常每个字符占1字节),而`sizeof(pStr)`返回指针本身的大小,通常是4字节(在32位系统中)。这证明了数组名和指针在内存占用上有本质的区别。 在函数调用约定中,C/C++的`_cdecl`协议规定了参数入栈的方式。例如,字符类型的变量会被扩展到字的大小,这是因为栈操作通常是按字进行的。INTSIZEOF宏用于计算变量占用空间的对齐方式,确保参数在栈上的存储对齐到int的边界,避免内存访问异常。 文档还提醒编程者,理解数组和指针的差异对于避免编程错误至关重要。同时,作者呼吁计算机图书的作者应更深入地探讨和解释技术概念,以便帮助读者更好地理解编程语言的本质。 C/C++中的`struct`也是重要的数据结构,用于组合多个数据项。在大型项目中,熟练使用`struct`是衡量开发者经验的一个标准。而在嵌入式编程中,了解指针、数组和struct的使用尤其关键,因为这些环境通常资源有限,正确管理内存和数据结构对于程序的效率和稳定性至关重要。 此外,文档提及了C/C++中的`extern "C"`,这是为了在C++代码中兼容C语言的链接方式,避免名字修饰(name mangling)带来的问题。`void`和`void`指针则允许不指定数据类型,提供了一定的灵活性。可变参数表(varargs)如`printf`函数使用的`...`,则允许函数接受不同数量和类型的参数。 理解C/C++中数组、指针、struct和调用约定等基本概念是成为一名合格的嵌入式C/C++程序员的基础,这些知识对于编写高效、可靠的代码至关重要。