学习 C 数组与指针小结

On 2010 年 7 月 23 日, in 程序人生, by donly

在 C 语言中,数组其实是一种变相使用指针的形式。通过了解指针与数组之间的关系,可以使用指针方便地操作数组。以下是一些指针和数组之间的关系说明:


...
int * p; // 定义一个整型指针
int arr[2] = {1, 2}; // 定义一个整型数组

p = arr; // 把数组地址赋给指针
p == &arr[0]; // 指针 p 指向数组 arr 首元素地址
arr == &arr[0]; // 数组名同时代表数组首元素的地址

p + 1 == &arr[1]; // 对指针加 1 等于加上它所指向的对象的字节大小 (int 一般为 4 字节)
p + 2 == &arr[2]; // 相同的地址
*(p + 2) == arr[2]; // 相同的值,arr 数组第三个元素的值
*(arr + i) == arr[i]; // 与下面语句等价,arr 为数组名
*(p + i) == arr[i]; // p 为指针变量,可使用 p++ 表达式
++p != ++arr; // 只能对指针变量使用自增一元运算符,在此语法错误!
...


例子 1:

/* arr_and_p.c -- 对一个数组的所有元素求和 */
#define SIZE 10
#include
int sum (int *, int *); // 声明函数原型
int main (void)
{
int balls[SIZE] = {30, 20, 25, 9, 56, 14, 18, 16, 21, 28};
long total = 0;

total = sum (balls, balls + SIZE); // 调用函数, balls + SIZE 为数组的结束地址
printf ("The total number of balls is %ld.n", total);

return 0;
}

int sum (int * start, int * end) // 函数定义
{
int total = 0;

while (start < end) { total += *(start++); // 此处括号可省略,* 和 ++ 优先级相同,从右至左 } }
此例子主要演示使用指针对数组操作的函数,最后函数返回数组内所有元素的和。
首先看程序第 4 ,10, 16 行的数组参数变量的声明和调用。

第 4 行中,由于原型允许省略名称,所以还有以下 3 种原型是和它等价的:

int sum (int * start, int * end);
int sum (int start[], int end[]);
int sum (int [], int []);

使用指针作为参数来处理数组时,可选用数组符号或指针符号。正如多数程序员认为的,程序员的主要任务是保证程序的正确性和可读性,代码的优化应该留给编译器去做。

在处理数组的函数中使用指针作为形式参量(而不是数组),而在函数中可以使用数组符号来处理数组。同时,使用数组名做为参数时,实质上是传递的是数组的地址,而非整个数组。也正由于指针与数组名可以互换使用,一般调用处理数组的函数时,传递该数组的开始和结束地址即可(如例1)。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注