欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

指针

程序员文章站 2022-03-26 12:37:24
...

指针

指针是什么

指针 是一种数据变量类型,它储存了一个寄存器地址,这个地址的值指向储存在该地址的对象的值。

指针
名为 a 的指针,指向一个存储器地址,当中的值为 b。
图片来自Wikipedia.org

指针的优点

指针相对于值传递的速度更快(占用储存空间较多的情况下),值传递在C/C++中是将已有对象复制一份到一个新的内存空间中;而指针则是给出储存数据的位置和数据类型,对数据直接进行操作。

coding环节

例一

观察下面两种方法的输出结果有何不同

例一值传递

#include <stdio.h>
#include <stdlib.h>

void swap(int a, int b) {
    int c = a;
    a = b;
    b = c;
}

int main() {
    int a = 2, b = 3;

    swap(a, b);

    printf("a=%d\tb=%d\n", a, b);
    return 0;
}

例一指针传递

#include <stdio.h>
#include <stdlib.h>

void swap(int* pa, int* pb) {
    int c = *pa;
    *pa = *pb;
    *pb = c;
}

int main() {
    int a = 2, b = 3;

    swap(&a, &b);

    printf("a=%d\tb=%d\n", a, b);
    return 0;
}

例一总结

值传递只是拷贝了一份变量到新的内存空间,对新内存空间中的变量进行操作,而不会对原有变量造成任何影响。指针操作则直接对原有变量内存空间中的数据进行了修改,从而正确地完成了交换数据的功能。

例二

对比两种方法的运行时间

例二值传递

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct {
    int a;
    float b;
    double c;
    double d;
    double e;
    double f;
    double g;
    double h;
} comp;

int main() {
    comp a, b = { 0 };
    getchar();               //排除编译过程对运行时间产生的影响
    clock_t start = clock();
    int i = 0;
    for (; i < 1000000; i++) {
        a = b;
        b.a = i;
    }
    clock_t end = clock();
    printf("Used time=%dms\n", end - start);
    return 0;
}

例二指针传递

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct {
    int a;
    float b;
    double c;
    double d;
    double e;
    double f;
    double g;
    double h;
} comp;

int main() {
    comp *a, b = { 0 };
    getchar();               //排除编译过程对运行时间产生的影响
    clock_t start = clock();
    int i = 0;
    for (; i < 1000000; i++) {
        a = &b;
        b.a = i;
    }
    clock_t end = clock();
    printf("Used time=%dms\n", end - start);
    return 0;
}

例二总结

在变量占用空间较多的情况下,采用指针传值会比普通的值传递快很多

总结

指针作为一种高效的传递参数的变量类型,正确地使用可以加快程序运行速度。在C/C++中也有许多用到了指针的地方。例如:qsort,sort函数 cout操作符等。

相关标签: 指针