• 指针、数组与sizeof运算符


     指针、数组与sizcof运算符

    (1)sizeof是c语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返同()里面的变量或者数据类型占用的内存字节数。

    (2)sizeof存在的价值?主要是因为在不同平台下名种数据类型所占的内存字节数不尽相同(譬如int在32位系统中为4字节,在16位系统中为2字节)。所以程序中需要使用sizeof来判断当前 变量/数据类型 在当前环境下占几个字节。

    (3)strlen是一个C库函数,用来返同一个字符串的长度(注意,字符串的长度是不计算字符串末尾的''的)。一定要注意strlen接收的参数必须是一个字符串。(字符串的特征是以''结尾)

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
            char str[] = "hello";
            printf("sizeof(str) = %d
    ",sizeof(str));        //字符串的所占的内存空间是6个字节
            printf("sizeof(str[0]) = %d
    ",sizeof(str[0]));  //字符串首元素所占的内存空间就是一个字节
            printf("strlen(str) = %d
    ",strlen(str));        //字符串的长度是不包括最后一位的'',所以长度是5
    
            return 0;
    }

    在这里顺便再来普及一下字符数组字符串的常识性问题,其实C语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串。

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
            char str0[] = {'h','e','l','l','o'};  //字符数组

         char str1[] = "hello";          //字符串
            printf("sizeof(str0) = %d
    ",sizeof(str0));  //5
            printf("sizeof(str1) = %d
    ",sizeof(str1));  //6
    }

    我们在gcc编译器下得到的编译结果如下图所示

    所以

    char str0[] = {'h','e','l','l','o'};   等价于    char str0[6] = {'h','e','l','l','o'};
    char str1[] = "hello";                等价于     char str1[7] = "hello";  

    好,我们继续来说sizeof的问题

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
            char str[] = "hello";
            char *p = str;
    
            printf("sizeof(p) = %d
    ",sizeof(p));   //p是指针变量,32位系统中所有指针所占的内存空间都是4,不管是什么类型的指针,相当于sizeof(char* )= 4
            printf("sizeof(*p) = %d
    ",sizeof(*p));  //*p是P所指向的那个内存空间里存储的内容,数组名所表示的是一个数组的首地址,
                                  //也可以理解成数组首元素的地址,所以*p的内存空间就是1,相当于sizeof(char) = 1
            printf("strlen(p) = %d
    ",strlen(p)); //相当于strlen(str) = 5
    }

    gcc编译结果如下图所示,前三行p和str和&str[0]的地址都是一样的

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
            int a = 10;
    
            printf("sizeof(a) = %d
    ",sizeof(a));
            printf("sizeof(int) = %d
    ",sizeof(int));
    }

    sizeof测试一个变量本身,和sizeof测试这个变量的类型,结果是一样的。gcc编译结果如下图所示,结果都是4

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
            int b[100];
    
            printf("sizeof(b) = %d
    ",sizeof(b)); //100*sizeof(int)
    
    }

    sizeof (数组名)的时候,数组名不做左值也不做右值。纯粹就是数组名的含义。那么sizeof(数组名)实际返回的是整个数组所占用内存空间(以字节为单位的)

    #include <stdio.h>
    #include <string.h>
    
    void func(int b[100])
    {
            printf("sizeof(b) = %d
    ",sizeof(b));
    }
    int main()
    {
            int a[100];
            func(a);  //4,因为a在func内部就是指针,而不是数组
    }

    (1)函数传参,形参是可以用数组的

    (2)函数形参是数组时,实际传递是不是整个数组,而是数组的首元素首地址。也就是说函数传参用数组来传,实际相当于传递的是指针指针指向数组的首元素首地址)

    (3)在func子函数内部,a传进来的就是数据的指针(即首地址),函数形参传递数组的时候,其实本质就值传递了一个数组的首地址,而数组的大小就丢了

    gcc编译结果如下

    所以平时在函数调用数组时,采用如下的函数

    #include <stdio.h>
    #include <string.h>
    
    void func(int a[],int num)
    {
            //在子函数内,a传进来的就是数组的指针(首地址)
            //在子函数内,num是数组的大小   
    }
    int main()
    {
            int a[100];
    
            func(a,sizeof(a));
    }

    下面来说说#define和typedef

    #include <stdio.h>
    
    
    #define dpchar char*
    typedef char* tpchar;
    
    int main()
    {
        dpchar p1,p2;
        tpchar p3,p4;
    
        printf("sizeof(p1) = %3d
    ",sizeof(p1));
        printf("sizeof(p2) = %3d
    ",sizeof(p2));
        printf("sizeof(p3) = %3d
    ",sizeof(p3));
        printf("sizeof(p4) = %3d
    ",sizeof(p4));
    
        return 0;
    }

    vc++6.0编译结果如下:

    原因很简单,typedef就是给一个已有类型取一个别名,而#define就是字符串替换

    dpchar p1,p2; 等价于 char* p1;char p2;
    tpchar p3,p4;  等价于 char* p3;char* p4;

    希望这篇对大家很有帮助!!!

  • 相关阅读:
    windows配置solr5.5.2(不通过tomcat,使用内置jetty)
    6月8日云栖精选夜读:mac下eclipse配置tomcat无法启动问题
    零配置部署 React
    万亿级数据洪峰下的分布式消息引擎
    ENode 2.0
    WannaCry感染文件恢复方法_企业再也不用愁了!
    中国最强的人工智能学术会议来了
    1篇文章看懂峰值带宽、流量、转码、连麦、截图五大直播计费方式
    CSS基础(三)
    CSS基础(三)
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/10293435.html
Copyright © 2020-2023  润新知