一、一维数组“数组”是一些值的集合,下标和数组名一起使用,用于标识该集合中某个特定的值。
1、数组名是一个
指针常量,不是指针变量,因为当程序完成连接时,内存中数组的位置是固定的。
在两种场合下,数组名不用指针常量来表示——当数组名作为sizeof操作符或单目操作符&的操作数时。sizeof返回这个数组的长度,而不是指向数组指针的长度。取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。如:
int a[10];
int b[10];
int *c;
c = &a[0];
/**
表达式&a[0]表示指向数组第一个元素的指针。而表达式“c = a”实现了相同的功能。
**/
b = a;
/**
这么做事非法的,不能使用赋值符吧一个数组的所有元素复制到另一个数组。如果达到复制的目的,我们需要使用循环。
**/
a = c;
/**
这么做是非法的,因为a是指针常量,不能被修改
**/ |
2、下标引用
在使用下标引用的地方,我们可以使用对等的指针表达式来表示。如:
int array[10];
int *ap = array + 2; |
下面涉及ap与array的对等表达式:
1)、
ap:根据表达式,我们知道这个表达式与“&array[2]”是对等的。
2)、
*ap:间接访问指针所指向的位置,即arry[2]。也可以写成:*(array+2)。
3)、
ap[0]:能这样做吗?当然可以!!C的下标引用和间接访问表达式是一样的。其对等表达式是*(ap+0)。当然,表达式结果与array[2]的结果是相同的。
4)、
ap+6:ap指向的是array[2]的地址,所以ap+6指向的是array[2]向后移动6个整数位置的地址,即array[8]的地址。
5)、
*ap+6:注意元素优先级!这个表达式先运行间接访问,在运行加法运行。所以,这个与这个表达对等的表达式是array[2]+6。
6)、
*(ap+6):首先执行加法运算,所以这个表达式得到的值是array[8]。
7)、
ap[6]:其对等表达式是*(ap+6),与上个表达式的结果相同。
8)、
&ap:首先,这个表达式是合法的。但并没有对等的涉及array的表达式,因为无法预测编译器把ap放在相对于array的什么位置。
9)、
ap[-1]:负的下标?!下标引用就是间接访问的表达式,下标就是偏移量。所以使用偏移量-1,我们得到ap前面一个元素的地址,即array[1]的地址。
特殊的表达式:"2[array]"。疯了!啥意思?
与这个表达式对等的表达式是*(2+array),明白了?明白了!
3、数组与指针
数组与指针有很多类似的地方,但数组与指针不是相等的。
声明一个数组时,编译器将根据声明制定的元素数量为数组保留内存空间,然后再创建数组名,它的值是指针常量,指向这段空间的起始位置。
声明一个指针变量时,编译器职位指针本身保留内存空间,它并不为任何整型值分配内存空间。而且,指针变量并不被初始化为指向任何现有的内存空间,如果它是一个自动变量,它甚至不会被初始化。
通过上述声明后,表达式*a是完全合法的,但*b是非法的。*b将访问内存中某个不确定的位置,很可能导致程序错误终止。另一方面,b++可以通过编译,但a++不能,因为a的值是个常量。
4、作为函数参数的数组名
首先我们要明确的是,C语言中函数的参数是使用值传递的方式的。所以在给函数传递一个数组参数时,传递的是参数的一份拷贝,即数组的首地址。
阅读(595) | 评论(0) | 转发(0) |