C语言数组与指针的深度解析及应用实践
1. 数组与指针基础
在大多数表达式中,数组名的值是指向数组第一个元素的指针。不过,存在两个例外情况:一是 sizeof
运算符返回的是整个数组的字节数,而非指针的大小;二是一元 &
运算符返回的是指向数组第一个元素的指针,并非指向该指针的指针。
除了优先级不同,下标表达式 array[value]
与间接寻址表达式 *( array + ( value ) )
是等价的。这意味着下标既可以与数组名一起使用,也能用于指针表达式,这使得编译器难以检查下标的有效性。通常情况下,指针表达式可能比下标更高效,但下标绝不会比指针表达式更高效。然而,为了提高运行时效率而降低程序的可维护性,通常并非明智之举。
指针和数组并不等价,数组和指针变量的属性差异显著。声明数组会创建用于存储数组元素的空间,而声明指针变量仅创建用于存储指针的空间。当数组名作为函数参数传递时,传递给函数的是指向第一个元素的指针,该参数是一个副本,因此函数可以对其进行操作而不影响实际参数。不过,对指针参数应用间接寻址操作,函数就能修改原始数组元素。数组参数既可以声明为数组名,也可以声明为指针,这两种声明形式仅在函数参数中是等价的。
数组可以使用花括号括起来的值列表进行初始化。静态变量(包括数组)在程序加载到内存时接收其初始值,而自动变量(包括数组)每次执行进入声明它们的块时,都必须使用隐式赋值语句进行重新初始化。如果初始化列表中的值少于数组的大小,数组的最后几个元素将用默认值初始化。如果省略了初始化数组的维度,编译器会使数组刚好足够大以容纳初