您的位置:首页 > 编程语言 > C语言/C++

c语言中数组名和指针变量的区别

2017-06-22 15:49 141 查看
编译器工作原理:在64位的计算机中,当创建一个指针变量时,计算机会为它分配8个字节的存储空间。但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的起始地址。

结论1:由于计算机没有为数组变量分配空间,也就不能把它指向其他地方。例题:

char s[]="How big is it?";
char *t=s;   //正确,将数组的地址赋给指针变量t
s=t;        //错误,数组变量没有存储空间,无法存储指针变量t的值,编译报错


结论2:如果对数组变量使用取地址符&,结果是数组变量本身。

#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[3]={1,2,3};
printf("arr=%p\n",arr);
printf("&arr=%p\n",&arr);

return 0;
}

结果为:
fly@noi:~$ ./t
arr=0x7ffed97ce8d0
&arr=0x7ffed97ce8d0


结论3:sizeof(数组)的值是数组的大小,sizeof(指针)是操作系统上一个地址的大小,64位机上是8个字节,32位机上是4个字节。

#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[3]={1,2,3};
int *p=arr;
printf("sizeof(arr)=%d\n",(int)sizeof(arr));
printf("sizeof(p)=%d\n",(int)sizeof(p));

return 0;
}

输出:
fly@noi:~$ ./t
sizeof(arr)=12
sizeof(p)=8


通过结论3可知:假如把数组变量赋给一个指针,那么指针变量只会包含数组的地址信息,而对数组的长度一无所知,相当于指针丢失了一些信息。我们把这种信息的丢失称为退化。只要把数组变量传递给函数,数组免不了退化为指针,所以,把数组传递给函数,需要明确的指明数组的大小。向这样:

int arr[3]={1,2,3};
int sum_arr(int arr[],int n);   //用整型变量n明确指出数组大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: