2014-09-05 376 views
0

我有以下代码指向int类型数组的指针的大小是多少?

#include <stdio.h> 
int main(void) { 
    int arr[] = {10,20,30,40}; 
    int* ptr = arr; 
    printf("%d\n",sizeof(arr)); 
    printf("%d",sizeof(ptr)); 
    return 0; 
} 

的输出是用C

16 
4 

尺寸指针为4“的常用3”也是一个指针的整数,但其大小出来是16 ,它是一个元素的大小和元素的数量的乘积。另一方面,如果我将相同的指针存储到另一个指针变量中,那么它的大小就变成4.这很混乱。如果我尝试将arr作为参数发送给函数,然后在该函数中输出arr的大小,会发生同样的情况。 C如何处理指向数组的指针?

+1

这里是一个很好的解释指针和数组之间的区别[是数组名称中的指针?](http://stackoverflow.com/questions/1641957/is-array-name-a-pointer- in-c) – 2014-09-05 13:16:58

+0

另请参阅comp.lang.c [常见问题7.28“为什么sizeof不能指示指针指向的内存块的大小?”](http://c-faq.com/ malloc/sizeof.html) – david 2014-09-05 13:27:28

+0

感谢@KlasLindbäck上面的例子清除了我所有的误解。 – shafeeq 2014-09-05 13:32:56

回答

5

'的常用3' 也是整数

不,它不是一个指针。 arr是一个数组。数组的大小是元素大小乘以元素数量的大小。如果它是一个指针,它的大小将与其他指针相同。

C如何处理数组的指针?

C以与处理所有其他指针相同的方式处理指向数组的指针。但是,在代码中没有指向数组的指针,只有指向int的指针(ptr)。

3

指针只是一个内存地址,因此在32位系统上它总是4个字节。取决于环境,它在64位系统上是4或8个字节。

你的例子中没有真正的混淆。 arr是4个32位整数的数组,因此有16个字节。它被“处理”或“传递”,作为指向第一个int的指针,即int*,这就是为什么您可以将它复制到该类型的其他变量(显式或作为参数)的原因。此时与原始数组不再有任何关系,它只是一个指针 - 系统上有4个字节。

来看待它,最好的办法是,有从int[]int*可能的隐式转换,像有从charint

0

sizeof只适用于查找数组的长度,如果您将其应用于原始数组。

int a[5]; //real array. NOT a pointer 
sizeof(a); // :) 

但是,当数组衰减到指针时,sizeof将给出指针的大小而不是数组的大小。

int a[5]; 
int * p = a; // assigning address of the array to pointer 
sizeof(p); // :(

它将始终返回32位系统上的4个字节和64位系统上的8个字节!

当数组传递给函数并继续保持类型系统中的数组长度时,数组会衰减为指针。

当您将数组传递给函数时,它会衰减指针。所以sizeof函数将返回的int *

大小所以,当你的数组传递给函数需要传递的元素数量须─

void function (size_t sz, int *arr) { ... } 
: 
{ 
    int x[20]; 
    function (sizeof(x)/sizeof(*x), x); 
} 
1
  • 当你做sizeof(arr)你会得到数组的大小是number of elements * size of int
  • 当你做sizeof(ptr)你会得到指针的大小是size of int

这很混乱。如果我尝试将arr作为参数发送给函数,然后在该函数中输出arr的大小,会发生同样的情况。

当您发送像这样的数组foo(arr)时,您实际上发送的基地址为arr。当我们将一个变量的地址传递给一个函数时,它将把地址存储在一个指针中。所以再次如果你尝试获得arr的大小,你会得到指针的大小。