为什么要使用指针?

我知道这是一个非常基本的问题,但是我在用高级语言编写几个项目之后才开始使用一些基本的C ++编程。

基本上我有三个问题:

  • 为什么使用指针超过正常变量?
  • 何时何地应该使用指针?
  • 你如何使用数组指针?

  • 为什么使用指针超过正常变量?
  • 简短的回答是:不要。 ;-)指针将被用于你不能使用其他任何东西的地方。 这要么是因为缺乏适当的功能,缺少数据类型或纯粹的性能。 更多下面...

  • 何时何地应该使用指针?
  • 这里简短的回答是:你不能使用其他任何东西。 在C中,您不支持复杂的数据类型,如字符串。 也没有办法将一个变量“通过引用”传递给一个函数。 这就是你必须使用指针的地方。 你也可以让他们指向几乎任何东西,链表,结构成员等等。 但是,我们不要在这里进入。

  • 你如何使用数组指针?
  • 没有多少努力和很多困惑。 ;-)如果我们谈论诸如int和char这样的简单数据类型,那么数组和指针之间几乎没有区别。 这些声明非常相似(但不一样 - 例如, sizeof将返回不同的值):

    char* a = "Hello";
    char a[] = "Hello";
    

    你可以像这样到达数组中的任何元素

    printf("Second char is: %c", a[1]);
    

    索引1,因为数组以元素0开始。:-)

    或者你也可以这样做

    printf("Second char is: %c", *(a+1));
    

    指针操作符(*)是必需的,因为我们告诉printf我们要打印一个字符。 如果没有*,则会打印内存地址本身的字符表示。 现在我们正在使用角色本身。 如果我们使用了%s而不是%c,我们会要求printf打印由'a'指向的内存地址的内容加上一个(在上面的例子中),我们不必将*前面:

    printf("Second char is: %s", (a+1)); /* WRONG */
    

    但是,这不会仅仅打印第二个字符,而是打印下一个内存地址中的所有字符,直到找到空字符( 0)。 这就是事情开始变得危险的地方。 如果您不小心尝试使用%s格式化程序打印类型为integer的变量而不是字符指针?

    char* a = "Hello";
    int b = 120;
    printf("Second char is: %s", b);
    

    这将打印内存地址120上找到的内容,并继续打印直到找到空字符。 执行此printf语句是错误的和非法的,但无论如何它可能会起作用,因为在许多环境中指针实际上是int类型的。 想象一下,如果你使用sprintf()而不是使用sprintf(),可能会导致这些问题,并将这种方式分配给另一个变量的“char数组”过长,只能分配一定的空间。 你很可能最终会写内存中的其他内容,并导致你的程序崩溃(如果你幸运的话)。

    哦,如果你在声明它的时候没有给字符数组/指针赋一个字符串值,那么在给它一个值之前,你必须给它分配足够的内存。 使用malloc,calloc或类似的。 这是因为你只声明了你的数组中的一个元素/一个单一的内存地址指向。 这里有几个例子:

    char* x;
    /* Allocate 6 bytes of memory for me and point x to the first of them. */
    x = (char*) malloc(6);
    x[0] = 'H';
    x[1] = 'e';
    x[2] = 'l';
    x[3] = 'l';
    x[4] = 'o';
    x[5] = '';
    printf("String "%s" at address: %dn", x, x);
    /* Delete the allocation (reservation) of the memory. */
    /* The char pointer x is still pointing to this address in memory though! */
    free(x);
    /* Same as malloc but here the allocated space is filled with null characters!*/
    x = (char *) calloc(6, sizeof(x));
    x[0] = 'H';
    x[1] = 'e';
    x[2] = 'l';
    x[3] = 'l';
    x[4] = 'o';
    x[5] = '';
    printf("String "%s" at address: %dn", x, x);
    /* And delete the allocation again... */
    free(x);
    /* We can set the size at declaration time as well */
    char xx[6];
    xx[0] = 'H';
    xx[1] = 'e';
    xx[2] = 'l';
    xx[3] = 'l';
    xx[4] = 'o';
    xx[5] = '';
    printf("String "%s" at address: %dn", xx, xx);
    

    请注意,在执行完分配内存的free()之后,仍然可以使用变量x,但不知道里面有什么。 另外请注意,两个printf()可能会给你不同的地址,因为不能保证第二次分配的内存是在与第一次分配相同的空间中执行的。


    使用指针的一个原因是可以在被调用函数中修改变量或对象。

    在C ++中,使用引用比指针更好。 尽管引用实际上是指针,但C ++在一定程度上隐藏了事实,并使得它看起来好像是按值传递的。 这可以很容易地改变调用函数接收值的方式,而无需修改传递它的语义。

    考虑下面的例子:

    使用参考:

    public void doSomething()
    {
        int i = 10;
        doSomethingElse(i);  // passes i by references since doSomethingElse() receives it
                             // by reference, but the syntax makes it appear as if i is passed
                             // by value
    }
    
    public void doSomethingElse(int& i)  // receives i as a reference
    {
        cout << i << endl;
    }
    

    使用指针:

    public void doSomething()
    {
        int i = 10;
        doSomethingElse(&i);
    }
    
    public void doSomethingElse(int* i)
    {
        cout << *i << endl;
    }
    

  • 指针允许您从多个位置引用内存中相同的空间。 这意味着您可以在一个位置更新内存,并且可以从程序中的其他位置看到更改。 您还可以通过共享数据结构中的组件来节省空间。
  • 您应该在需要获取的地方使用指针,并将地址传递给内存中的特定地点。 您还可以使用指针来导航数组:
  • 一个数组是一个连续内存块,已经被分配了一个特定的类型。 数组的名称包含数组的起始点的值。 当您添加1时,会将您带到第二个位置。 这允许你编写循环来递增一个沿着数组向下滑动的指针,而不需要一个明确的计数器来访问数组。
  • 这里是C中的一个例子:

    char hello[] = "hello";
    
    char *p = hello;
    
    while (*p)
    {
        *p += 1; // increase the character by one
    
        p += 1; // move to the next spot
    }
    
    printf(hello);
    

    版画

    ifmmp
    

    因为它取得每个角色的值并将其加1。

    链接地址: http://www.djcxy.com/p/5411.html

    上一篇: Why use pointers?

    下一篇: How can I use pointers in Java?