学习 C 数组与指针小结

七月 23rd, 2010, in 程序人生, by None
在 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)。

发表回复

您的 email 地址不会被公开。 必填信息前已经标志为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>