这是我的页面头部

c程序设计--指针与数组

从K&D 选摘的译了一段。据已之好。所以与原文相处甚远。

The C programming Language
Chapter 5 - Pointers and Arrays

要指针,不要数组。

数组就是指针:

在C语言里,数组和指针有着天然的亲密联系,以至于不得不能把它们分开来谈。任何用数组可以实现的操作,都可以用指针来实现。指针实现起来更快。
数组的下标和指针运算非常相似。在定义变量时,数组类型变量的值就是数组中地址偏移为0元素的地址。即:
p=&a[0];

因为数组名等价于数组首元素的位置,上面的表达式也可以写成:
p=a;

关于数组名和指针,有一点区别必须明确:指针是变量,所以p=a或者p++是合法的。数组名不是变量,所以a=p或a++是非法的。
当用数组用作为函数参数时,函数传递的实际是数组的首元素的地址。在被调用的函数中,参数是本地变量(local variabe),所以,数组名就是一个指针。也就是说,一个内容为“地址”的变量。据此,我们可以写一个测试字符串长度的函数strlen():
/* strlen:  return length of string s */
   int strlen(char *s)
   {
       int n;

       for (n = 0; *s != '\0', s++)
           n++;
       return n;
   }

由于s是一个指针,对其进行自加(s++)是合法的。s++不会影响调用strlen()的函数中的原来的字符串,而仅仅改变strlen()的私有指针变量s。这意味着下面的调用都是正确的。
   strlen("hello, world");   /* 静态字串 */
   strlen(array);            /* char型数组 */
   strlen(ptr);              /* char型指针 */

在定义形参时,
char s[]

char *s;
是等价的。我们更喜欢后者。因为它更明确地指出这是一个指针变量。一个数组名被传给一个函数时,函数会按自己的爱好选择把它当成数组还是指针,并灵活地处理它。如果不会影响代码的清晰表达,也可以两种方法混用。


地址运算:



指针用做函数参数:

在c语言中,函数参数是按值传递的,被调用函数没有办法直接改变调用函数中的变量。例如,一个排序程序想通过调用swap参数来改变交换两个参数。这样写是不起作用的:
swap(a,b);
在函数这样实现时:
   void swap(int x, int y)  /* WRONG */
   {
       int temp;

       temp = x;
       x = y;
       y = temp;
   }


上面的函数复制了变量a和b,并把复制的这两个变量的值做了交换。

正确的调用应该这样写:
swap(&a, &b);

这时的函数体应该是下面这样:
   void swap(int *px, int *py)  /* interchange *px and *py */
   {
       int temp;

       temp = *px;
       *px = *py;
       *py = temp;
   }


指针数组和指向指针的指针:
指针本身也是变量,他们可以像别的变量一样被保存为数组。
posted @ 2007-07-26 19:01  范晨鹏  阅读(515)  评论(0编辑  收藏  举报