3.1 指针和数组
对于c语言中的数组,有两点要注意:
一、c语言中只有一维数组,而数组的大小必须在编译期间就作为一个常数确定下来。"c语言中只有一维数组",刚一听到这样的说法,感觉和平时看的书上说的完全不同,c语言明明有多维数组吗?且看下面的解释,c语言虽然只有一维数组,但是c语言中数组的元素可以是任何类型的对象,当然也可以是数组。这样,要"仿真"一个多维数组就不成问题。
二、对于数组我们只能做两件事情,确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其它的有关数组的操作,哪怕它们看上去是以数组下标进行运算的,实际上都是通过指针来进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此,我们可以完全依据指针行为定义数组下标行为。
对于声明: int calendar[12][31]; 的理解:
这个数组拥有12个数组类型的元素,每个元素是一个拥有31个整形元素的数组。
如果一个指针指向一个数组元素,那么指针减1,指向数组的上一个元素,指针加1,指向数组的下一个元素。
int a[10];
int *p = a; // 或者int *p = &a[0],令指针指向数组的第一个元素
数组名实际上是一个常量指针,它本身不能被修改,但它指向的内容可以被修改,如果对它指向的内容进行修改,实际上就是改变数组元素的值,数组名作为一个指针它指向数组的第一个元素。除了a被用作sizeof的参数之外,其它所有情况下数组名a都代表指向数组a中下标为0的元素的指针。
我们可以用p++,改变指针p,让它指向数组a的下一个元素,但是不能用a++来指向数组a的下一个元素,因为a是一个常量指针,它的值是不能被改变的,它是一个右值,而作为++运算符要求一个左值。
*a代表数组下标为0的元素的值,那么*(a+i)代表数组中下标为i的元素,因为它的常用,所以被简记为a[i] 。由于a + i和 i + a 的含义一样,所以对应的简写 a[i] 和 i[a]也是一样。对于后一种写法i[a]不提倡,但它是正确的,也体现了指针和数组之间的密切关系。
3.2 非数组的指针
在c语言中,字符串常量代表了一块包括字符串所有字符以及一个空字符'\0'的内存区域的地址。
3.3 作为参数 的数组声明
在c语言中,是不能将数组直接作为参数来传递的,当我们用数组名作为参数时,该数组名会立即被转换为指向数组第一个元素的指针。即 int strlen(char s[]); 和 int strlen(char *s); 是完全一样的。
阅读(1013) | 评论(0) | 转发(0) |