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


    编译器工作原理:在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
    ",arr);
        printf("&arr=%p
    ",&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
    ",(int)sizeof(arr));
        printf("sizeof(p)=%d
    ",(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明确指出数组大小
  • 相关阅读:
    进程和程序
    linux socket基本知识
    window核心编程 第五章 作业
    树的基本操作(C语言)
    每天都在反省自己,但是每天却都浑浑噩噩
    Windows核心编程 内核对象
    还没完整看过一本技术的书籍啊
    管道
    Memory Layout of a C Program(7.6)
    cpio命令用法
  • 原文地址:https://www.cnblogs.com/litifeng/p/7065384.html
Copyright © 2020-2023  润新知