码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-06-22 16:45:49      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:code   需要   div   char   blog   无法   变量   没有   main   

编译器工作原理:在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明确指出数组大小

 

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

标签:code   需要   div   char   blog   无法   变量   没有   main   

原文地址:http://www.cnblogs.com/litifeng/p/7065384.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!