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

指针数组、数组指针

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

    如: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);
    }
    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容