zoukankan      html  css  js  c++  java
  • 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;
       }


    指针数组和指向指针的指针:
    指针本身也是变量,他们可以像别的变量一样被保存为数组。

    范晨鹏
    ------------------
    软件是一种态度
    成功是一种习惯


  • 相关阅读:
    2018/08/23 cstring中memset()函数的运用
    HDU 6446 Tree and Permutation(赛后补题)
    51NOD 1154 回文串的划分(DP)
    第七章小结_查找
    列出连通集的邻接表解题
    第六章学习小结_初识图
    图的邻接矩阵和邻接表及深度优先搜索
    第五章学习小结
    深深深深深深入虎穴
    括号匹配_进阶篇 ( 7-2 符号配对 )
  • 原文地址:https://www.cnblogs.com/diylab/p/832658.html
Copyright © 2011-2022 走看看