数组与指针

C语言中指针与数组这两个概念之间的联系是如此密不可分,以至于如果不能理解一个概念,就无法彻底理解另一个概念. 而且,C语言对这些概念的处理,在某些方面与其他不为人熟知的程序语言都有所不同.

C语言中只有一位数组,而且数组的大小必须在编译器就作为一个常数确定(C99标准允许变长数组,GCC编译器实现了变长数组).然而数组的元素是任何类型的对象,所以可以造出多维数组.

关于数组,我们只能做两件事:1,确定数组的大小 2,获得该数组下标为0的元素的指针.而其他的有关数组的操作,看似是下标运算,实际上都是通过指针运算进行的.

考虑一下这样一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int arr[30][30];
int (*pointer)[30];

for (pointer = arr; pointer < arr + 30; pointer++) {
int *p;
for (p = *arr; p < *arr + 30; p++) {
*p = 1;
}
}

for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
std::cout << *(*(arr + i) + j);
}
}

这是用指针的方式对一个元素为数组的数组进行赋值并输出;

arr是这个数组的第一个元素的首地址,通过arr的加法运算来遍历数组 然后通过一个指向元素首地址的指针p对每个元素进行遍历

有一点需要注意:除了作为sizeof的参数,其他所有情形中数组名都是代表指向数组中下标为0的元素的指针

script>