Sizeof数组和指针

时间:2012-12-02 18:07:10

标签: c sizeof

这是我的示例代码

#include<stdio.h>
void main()
{
 int arr[]={1,2,3,4,5,6};
 char *ptr,a;
 a='c';
 ptr=&a;
 int *ptr1,a1;
 a1=4;
 ptr1=&a1;
 printf("%d  %d   %d",sizeof(arr), sizeof(ptr1), sizeof(ptr));
}

现在,据我所知,大小将告诉我存储变量所需的大小,现在这个的输出是

24 4 4

为什么arr=24的大小,毕竟它只是一个指针,它的大小应该是4?

感谢。

5 个答案:

答案 0 :(得分:5)

“......毕竟它只是一个指针......”?不。数组不是指针。 Array是一个数组对象:一个固定的连续内存块,用于存储数组元素,不涉及任何类型的指针。在你的情况下,数组有6个元素,每个元素大小为4。这就是为什么你的sizeof评估为24。

关于数组作为指针的常见误解已经被揭穿了数百万次,但不知怎的,它不时地继续弹出。阅读常见问题解答,如果您对此有任何疑问,请回来

http://c-faq.com/aryptr/index.html

P.S。正如@Joachim Pileborg在答案中正确指出的那样,sizeof不是一个功能。这是一个运营商。


数组行为与指针不同的另一个上下文是一元&运算符(“地址”运算符)。当将一元&应用于类型为int *的指针时,会生成类型为int **的指针。当将一元&应用于类型为int [10]的数组时,会生成类型为int (*)[10]的指针。这是两种截然不同的类型。

int *p = 0;
int a[10] = { 0 };

int **p1 = &p;      /* OK */
int **p2 = &a;      /* ERROR */
int (*p3)[10] = &a; /* OK */

这是另一个受欢迎的问题(和错误)来源:有时人们希望&在应用于int **数组时生成int [10]指针。

答案 1 :(得分:0)

当你有一个数组时,sizeof会返回数组的大小(请注意,数组的大小以字节为单位,而不是数组中的项目数) array),否则返回类型或表达式的大小。

但是,如果将数组传递给函数,则数组会降级为指针并且大小信息会丢失。

另外,从技术上讲,sizeof不是一个函数,它是该语言中的一个特殊关键字,并且在与表达式一起使用时也可以不使用括号。

答案 2 :(得分:0)

数组不会衰减到sizeof内的指针; sizeof(arr)返回为数组分配的总大小,在本例中为6 * sizeof(int)

答案 3 :(得分:0)

来自Wikipedia

  

当sizeof应用于数组名称时,结果就是大小   整个数组的字节数。 (这是为数不多的例外之一   规则将数组的名称转换为指向第一个数组的指针   数组的元素。)

答案 4 :(得分:0)

sizeof()运算符没有给出数组中元素的数量,它给出了一个东西在内存中占用的字节数。因此:

#include <stdio.h>

int main()
{
  char s[] = { 1, 2, 3, 4, 5, 0 };
  int xs[] = { 1, 2, 3, 4, 5, 0 };

  printf( "sizeof( s ) = %d\n",  sizeof( s  ) );
  printf( "sizeof( xs ) = %d\n", sizeof( xs ) );

  return 0;
}

sizeof( s ) = 6
sizeof( xs ) = 24
相关问题