C数组和指针

时间:2022-09-09 20:05:09

C数组和指针

  C语言中的指针与数组这两个概念之间的联系是如此的紧密,以至于如果不能理解一个概念,就无法彻底理解另一个概念。且C对这些概念的处理与其他语言都有所不同。

  1,C语言中只有一维数组,并且数组的大小必须在编译期间就作为一个常数确定下来。由于C语言中的数组的元素可以是任何的类型,当然也可以是另外的一个数组,因此可以“仿真”出多维数组。  

  2,对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的所有操作实际上都是通过指针进行的,哪怕看起来再怎么不像指针的操作也是。

  3,如果定义了一个数组a[3],那么,除了a被用于运算符sizeof的参数这种情况,在其他所有的情况下数组名a都代表指向数组a中下标为0的元素的指针;而sizeof(a)得到的是数组a中所有元素的个数,而不是指向数组a的元素的指针大小。

  4,由上一条可知,*a即数组a中下标为0的元素的引用。由于a是指向数组a的位置0的指针,因此a+i就是指向数组a的i位置的指针,*(a+i)就是这个指针的引用,这种写法是如此的常用,因此被简写为a[i](令人震惊的事实)。另外,由于a+i与i+a的含义一样,因此a[i]与i[a]也具有同样的含义。

  5,指针的算数运算:如果一个指针指向数组的一个元素,那么这个指针加1,就得到了指向该数组的下一个元素的指针;如果减1,就的到了指向前一个元素的指针,其他的数字也一样。如果两个指针都指向同一个数组的元素,那么这两个指针的差就是它们两者之间的元素个数;但是如果这两个指针不是指向同一个数组的元素,那么指针减法是无法保证正确性的。两个指针相加毫无意义。

  6,数组的标识符代表的是数组的起始地址,所以数组的标识符不是左值,不能给它赋值,可以把数组的标识符看做是数组起始处的只读指针。当把数组作为函数参数传递时,实际上真正声明的是一个指针(或者另一个说法:当数组作为函数参数传递时,退化为一个指向数组起始位置的指针)。另外,数组只能作为指针传递,且不可以按值传递。

  7,关于二维数组,定义 int cal[12][31],其意思是:cal是一个数组,该数组拥有12个数组类型的元素,其中每个元素都是一个拥有31个整形元素的数组(而不是拥有31个元素,每个元素都是数组元素为12的数组)。