c/c++中数组退化为指针

  “数组名至关于指针,指向数组的首个成员的地址”这种表述见过不少,但实际上,这种说法很不全面,甚至在某些状况下是错误的。下面举例来讲明一下。数组

  首先来看他们类似的特色:数据结构

  例1.

  int arr[] = {1,2,3,4,5};
  int * pointer = arr;
  printf("%d\n",arr[0]);
  printf("%d\n",*pointer);

上面两句的输出是相同的,即数组名能够转换成指向该数组的首地址的指针。函数

  可是若是更改一下输出语句:spa

  例2.

  printf("%d\n",sizeof(arr));
  printf("%d\n",sizeof(pointer));

结果就不一样了,前者输出为20,后者输出为4。这里能够体现出数组名与指针的不一样之处:arr表示一个数据结构的实体,其表明的含义要比指针丰富,虽然它能够牺牲掉一些信息转换成指针,20表示arr在内存中占用了20个字节的空间,而pointer仅仅是个指针,占用4个字节的空间。再来看一例:指针

  例3.

  int getLen(int arr[])
  {
  return sizeof(arr);
  }
  printf("%d\n",getLen(arr));

输出为何呢?是20么?呵呵,错了,应该是4。缘由在于当数组名做为参数传递给函数时,其将退化为一个指针。那为何在例2中sizeof()接受arr为参数时没有发生退化呢?由于sizeof()并非一个函数,而是一个操做符。code

二者的区别还有:blog

  指针是可修改的,进行自增或自减操做。而数组名是个常量,是不可修改的,也就是说,pointer++是合法的,可是a++是非法的。内存

相关文章
相关标签/搜索