指针和数组如何在c中互换使用

时间:2014-03-12 07:31:41

标签: c arrays pointers

我经常听说数组和指针在某些情况下可以互换使用,但两者并不意味着相同的事情,因此在什么情况下我们可以使用数组作为指针,反之亦然。

3 个答案:

答案 0 :(得分:3)

数组和指针从不相同的东西。

但是,在某些情况下,代码中的数组名称会“衰减”#34;指向第一个元素的指针。这意味着你丢失有关数组大小的信息,因为指针不知道它指向了多少元素(从技术上讲,它只指向一个如果你能知道结尾的位置,可以通过一个连续的数组前进,例如长度或标记值。)

数组不像指针那样的情况是(例如):

  • 当您对数组执行sizeof时:它是整个数组的大小,对于衰减的指针,它是指针的大小。
  • 当你想在一个数组中移动时:使用一个真正的数组,你必须使用索引,而你可以简单地增加指针。

请考虑以下代码:

#include <stdio.h>

void fn (int arr[]) {
    printf ("sz = %d\n", sizeof(arr));
    printf ("#4 = %d\n", arr[4]);
    arr = arr + 1;
    printf ("#4 = %d\n", arr[4]);
}

int main (void) {
    int x[] = {1,2,3,4,5,6,7,8,9};
    printf ("sz = %d\n", sizeof(x));
    printf ("#4 = %d\n", x[4]);
    //x = x + 1; // Cannot do this
    printf ("#4 = %d\n", x[4]);
    puts("=====");
    fn(x);
    return 0;
}

输出:

sz = 36
#4 = 5
#4 = 5
=====
sz = 4
#4 = 5
#4 = 6

你可以看到sizeof是不同的,你实际上可以移动指针,而数组名称是在一个固定的位置(如果你的话,你会得到一个错误取消注释试图增加它的行。)

答案 1 :(得分:2)

数组的名称非常类似于指向第一个元素的指针。这是它的价值,虽然它有其他不同的属性。

调用函数时最明显。如果你有:

float sum_floats(const float *x, size_t num_values);

你可以用:

来调用它
float three[] = { 1.f, 2.f, 3.f };
const float sum = sum_floats(three, sizeof three / sizeof *three);

注意函数调用中的three如何“衰减”到&three[0],即指向数组中第一个元素的指针。另请注意sizeof three如何仍然有效,因为three确实 是一个数组。

在函数内部,数组已衰减为const float *,即函数参数的类型,您不能再使用sizeof来获取调用者数组的大小(因为函数没有认为调用者使用了一个数组。)

答案 2 :(得分:0)

通常,数组是多个相同类型元素的容器,而指针是包含特定值的内存位置的内存地址。

当您声明这样的数组时:

int arr[] = {1, 2, 3, 4, 5};
printf("%d", *arr); /* will print 1 */
printf("%d", arr[0]); /* will print 1 as well */
/*or*/
int arr[5]; 

你正在为5个整数分配内存。请注意,数组名称本身充当指向数组中第一个元素的指针。

您可以使用指针实现相同的功能:

int* arr = new int[5];