美文网首页
指针与数组和函数的几个关系

指针与数组和函数的几个关系

作者: 第八区 | 来源:发表于2017-07-03 16:21 被阅读25次

    指针数组、数组指针

    • 指针数组。数组的元素类型是指针

      如:int* a[4]

    • 数组指针。指向数组的指针变量

      如:int (*a)[4];

    int main() {
        int a[4] = {1, 2, 3, 4};
        //指针数组
        int *b[4];
        //数组指针
        int (*c)[4];
        c = &a;
        for (int i = 0; i < 4; i++) {
            b[i] = &a[i];
        }
        printf("%d,%d", *b[1], c[0][1]);
    }
    

    定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写a[i]=c[i],这同样会出问题。

    指针函数、函数指针

    • 指针函数 一个返回值为指针的函数,本质是一个函数。

      //指针函数
      char *reverse(char *);
      
      int main() {
          char s[100] = "abc";
          char *res = reverse(s);
          if (res != NULL)
              printf("%s", res);
      }
      
      //字符串逆转,指针函数
      char *reverse(char *p) {
          if (p == NULL) {
              return NULL;
          }
          int count = 0;
          char *k = p;
          while (*k++) {
              count++;
          }
          char *start = p;
          char *end = p + count - 1;
          for (int i = 0; i < count / 2; i++) {
              char temp = *start;
              *start = *end;
              *end = temp;
              start++;
              end--;
          }
          return p;
      }
      
    • 函数指针 指向函数的指针变量,本质是一个指针。

      将上面的代码进行一些修改,使用函数指针来执行。

      int main() {
          char s[100] = "abc";
      //    char *res = reverse(s);
      //    if (res != NULL)
      //        printf("%s", res);
      //     声明函数指针
          char *(*funcPointer)(char *);
          funcPointer = reverse;
          char *res = funcPointer(s);
          if (res != NULL)
              printf("%s", res);
      }
      

    相关文章

      网友评论

          本文标题:指针与数组和函数的几个关系

          本文链接:https://www.haomeiwen.com/subject/ueczcxtx.html