我经常听说数组和指针在某些情况下可以互换使用,但两者并不意味着相同的事情,因此在什么情况下我们可以使用数组作为指针,反之亦然。
答案 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];