精华内容
下载资源
问答
  • char *s="\ta\017bc"中指针变量s 指向的字符串所占字节数是6的原因。'\t' 是一个转义字符相当于键盘“Tab”键‘a’ 普通字符'\017'转义字符ASCII代码值为8进制数17即10进制数15的那个符号(LZ可以自己去查下看是什么...

    b51a4c4f59e1

    string与strlen

    字符串赋值的时候会不会在末尾自动添加'\0'?

    char *s="\ta\017bc"中指针变量s 指向的字符串所占字节数是6的原因。

    '\t' 是一个转义字符相当于键盘“Tab”键

    ‘a’ 普通字符

    '\017'转义字符ASCII代码值为8进制数17即10进制数15的那个符号(LZ可以自己去查下看是什么符号)

    ‘b’ 普通字符

    ‘c’普通字符

    然后再加一个字符串结束标志‘\0’所以指针变量s,指向的字符串所占字节数是6

    char *s="\ta\017bc";

    for(;*s!='\0';s++)printf("*")//用查询的方法去统计字节数

    b51a4c4f59e1

    需要明确的第一点,strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。

    例如以下代码片断理论上也是可以编译通过的:

    char str[]="abcdefg";

    printf("%d\n",strlen(&str[5]));

    结果应当为2。该例中,strlen从字符str[5]即'f'开始计数,当到达'g'之后遇到'\0'并停止计数。因此结果为2。

    str2和str3的主要区别就在于C/C++字符串中,允许形如“\056”这样的所谓转义字符存在,它们仅表示一个字节位(byte),一般用于输出无法直接通过键盘输入的字符。

    str0的sizeof为8,导致没有\0结束,因此strlen的返回是不可预期的。

    str1的sizeof实际上是9,会自动加\0结束。

    str2的\056会被解释成8进制数056表示的字符,因此strlen是9,转义字符

    str3的\0会被解释为结束符

    b51a4c4f59e1

    b51a4c4f59e1

    二、sizeof深入理解。

    1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

    2.sizeof是算符,strlen是函数。

    3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以'\0'结尾的。sizeof还可以用函数做参数,比如:

    short f();

    printf("%d\n", sizeof(f()));

    输出的结果是sizeof(short),即2。

    4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

    5.大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

    char str[20]="0123456789";

    int a=strlen(str); //a=10;

    int b=sizeof(str); //而b=20;

    6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

    7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

    8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

    9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:

    fun(char [8])

    fun(char [])

    都等价于 fun(char *)在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去

    b51a4c4f59e1

    10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(dataalignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MSVC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragmapack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advancedcompiler页中的Data alignment为按字节对齐。

    11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式

    三、结束语

    sizeof使用场合。

    1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

    void *malloc(size_t size),

    size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

    2.用它可以看看一类型的对象在内存中所占的单元字节。

    void * memset(void * s,int c,sizeof(s))

    3.在动态分配一对象时,可以让系统知道要分配多少内存。

    4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。

    5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。

    6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

    展开全文
  • 数组在内存中所占字节数可以使用sizeof操作符来计算,该操作符是专门用于检测类型或变量...C语言中计算一个数组占内存多少空间(字节数)C语言中有一个专门用于检测类型或变量或数组在内存中占有的空间(字节数)的操...

    数组在内存中所占字节数可以使用sizeof操作符来计算,该操作符是专门用于检测类型或变量或数组在内存中所占有的空间(字节数);语法“sizeof(x)”,其中x是类型名、变量名或数组名等,可以返回x所占字节数。

    ddcbd5ec2fdaf51992016f09caa02a41.png

    本教程操作环境:windows7系统、c99版本、Dell G3电脑。

    C语言中计算一个数组占内存多少空间(字节数)

    C语言中有一个专门用于检测类型或变量或数组在内存中所占有的空间(字节数)的操作符sizeof,用它可以直接检测出数组在内存占有的字节数。

    语法规则是:sizeof(x);

    //识别没有歧义时也可写成:

    sizeof x;

    参数:x是类型名、变量名或数组名等,

    返回值:返回x所占字节数(int型)。

    以下代码可以帮助理解:#include "stdio.h"

    struct X{

    int d;

    float t;

    double b;

    char n[100];

    };

    int main(int argc,char *argv[]){

    int a[]={1,2,3,4,5,6,7,8,9,10};

    double y=3.1415926;

    struct X t[3]={{0,0.0f,0.0,""},};//结构体数组属复杂类型

    printf("10 elements of int array needs %d bytes.\n",sizeof a);//检测整型数组

    printf("Double variables of type need %d bytes.\n",sizeof(y));//double类型变量

    printf("Type float need %d bytes.\n",sizeof(float));//float类型

    printf("Structure array 't[3]' need %d bytes.\n",sizeof t);//检测复杂类型

    return 0;

    }

    更多编程相关知识,请访问:编程教学!!

    展开全文
  • 数组在内存中所占字节数可以使用sizeof操作符来计算,该操作符是专门用于检测类型或变量或数组在内存中占有的空间(字节数);语法“sizeof(x)”,其中x是类型名、变量名或数组名等,...

    数组在内存中所占字节数可以使用sizeof操作符来计算,该操作符是专门用于检测类型或变量或数组在内存中所占有的空间(字节数);语法“sizeof(x)”,其中x是类型名、变量名或数组名等,可以返回x所占字节数。

    C语言中计算一个数组占内存多少空间(字节数)

    C语言中有一个专门用于检测类型或变量或数组在内存中所占有的空间(字节数)的操作符sizeof,用它可以直接检测出数组在内存占有的字节数。

    sizeof(x);

    //识别没有歧义时也可写成:

    sizeof x;

    参数:x是类型名、变量名或数组名等,

    返回值:返回x所占字节数(int型)。

    以下代码可以帮助理解:

    #include "stdio.h"

    struct X{

        int d;

        float t;

        double b;

        char n[100];

    };

    int main(int argc,char *argv[]){

        int a[]={1,2,3,4,5,6,7,8,9,10};

        double y=3.1415926;

        struct X t[3]={{0,0.0f,0.0,""},};//结构体数组属复杂类型

        printf("10 elements of int array needs %d bytes.\n",sizeof a);//检测整型数组

        printf("Double variables of type need %d bytes.\n",sizeof(y));//double类型变量

        printf("Type float need %d bytes.\n",sizeof(float));//float类型

        printf("Structure array 't[3]' need %d bytes.\n",sizeof t);//检测复杂类型

        return 0;

    }

    声明:

    本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。


    展开全文
  • 数组分为一维数组,二维数组以及多维数组。我们着重看一下一维和二维数组; 一,1, 数组的格式   数组类型 数组名 [常量表达式] #define Maxlen 100 int str[Maxlen],nt str1[10]; 2,数组的初始化方式...

      我们先来简单介绍一下数组;数组分为一维数组,二维数组以及多维数组。我们着重看一下一维和二维数组;

    一,1, 数组的格式

     

    数组类型  数组名 [常量表达式]

    #define Maxlen  100

    int   str[Maxlen],nt str1[10];

    2,数组的初始化方式

    int  a[10]={1,2,3,4,5,6,7,8,9,10};

    int  a[]={1,2,3,4,5];,int a[5]={1,2,3];后面自动补零 a[3]=0,a[4]=0。

    字符数组的初始化

    char  str[20]="hello world!"别后面还有一个结束标志‘\'。注意越界访问

    char  str[20]={"hello world!"}

    char  str[]="hello world"

    char  str[]={'h','e','l','l','o','\0'}

    3,二维数组

    int a[i][j];  i表示行,j表示列。

    二维数组的初始化

    维数组与一维数组一样,可以对二维数组的元素进行赋值或者初始化。二维数组初始化的方法如下:

     

       ⑴分行给二维数组赋初值。

       int a[2][3]={{1,2,3},{5,6,7}}; 第一个内花括号的值赋给数组的第一行,第二个内花括号的值赋给数组的第二行。

     

       ⑵所有数据写在一个花括弧内,按顺序赋初值。

       int a[2][3]={2,3,5,6,7,8};它将第一组3个数赋给数组的第一行,第二组3个数赋给数组的第二行。该方法相对简单,但是,当数组元素较多时,容易出现混乱、遗漏、出错。在行、列数较多时,使用第一种方法较好。

     

    u ⑶对于定义的静态存储(关键字为static)数组,如果没有赋初值,则系统自动将全部元素赋以0值或\0值。

    u

    u   如:static int a[2][2];

         相当于static int a[2][2]={0,0,0,0}

    u

    u   而对定义的int a[2][2];如果不对其赋初值,则数组中各元素的值是不确定的。

        ⑷对部分元素赋初值

        数组在对部分元素赋初值时,如果后面的数组元素不赋初值,系统会对所有数组元素自动赋以0值。

        如:int a[2][3]={{0,2},{1}};

    相当于:int a[2][3]={{0,2,0},{1,0,0}};

      再如:static int d[2][3]={{8,5},{9}};

    相当于:static int d[2][3]={{8,5,0},{9,0,0}};

      又如:int b[2][3]={1,0,3};相当于:

            int b[2][3]={1,0,3,0,0,0};

     

       ⑸如果对全部元素都赋初值时,则定义数组时,第一维(行)的长度可以不指定,但第二维(列)的长度不能省需要指定。

        如:int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}

    等价于:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12

    ⑹键盘输入赋值

       通过键盘输入二维数组的数组元素,一般需要使用二重循环的形式进行。可以先行输入,也可先列输入。

     

       ①先行输入方式

         int a[3][4];                            

         for(i=0;i<2;i++)

            for(j=0;j<3;j++)

               scanf(%d,&a[i][j]);

    先列输入方式

         int a[3][4];

         for(j=0;i<3;j++)

            for(i=0;i<2;i++)

               scanf(%d,&a[i][j]);

     

    说明:不管是先行输入,还是先列输入,在计算机存储中数组元素仍然是按行存储的。

       ⑺通过赋值语句赋初值

      如:int a[2][2]; a[0][0]=1; a[0][1]=2; a[1][0]=3; a[1][1]=4;

     

       ⑻在定义数组时也可以只对部分元素赋值,而省略第一维的长度,但应使用分行赋值方式。

       如: int a[][4]={{1},{3,1},{0,0,9}};

       它与 int a[3][4]={{1},{3,1},{0,0,9}}; 等价。

     

    注:错误的初始化定义:

        int a[3][3]; a={1,2,3,4,5,6,7,8,9}; 这是错误的。

        而int a[3][3]; a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 也是错误的赋值方式。

    二,sizeof和strlen的区别

    sizeof为字节统计,strlen是字符长度统计函数

    我们都知道;在32位平台上,一个整形数组里面每一个单元所占字节数为4,unsigned short int里面为2,指针数组里面的每一个单元所占字节数也为4,字符型数组里面每一个单元所占字节则为1,对于实型 float为8,double和Long double则为8。

    int a[5]={1,2,3,4,5}

    sizeof(a)=4*5=20

    char str[10]={"hello"}

    sizeof(str)=10,strlen(str)=5

     

     

     

     

     

     

     

     

     

    展开全文
  • 数组中的字节

    千次阅读 2020-06-17 16:26:15
    ##sizeof查看定义的数组所占用字节数 #include<iostream> int main(){ using namespace std; int Inter [10]; short sh [10]; char ch [10]; long lg [10]; float fl [10]; double dou [10]; cout...
  • 20180316 数组所占空间

    千次阅读 2018-03-16 16:23:00
    数组array占用的空间为()。 6个字节 C语言中的字符串用指向该串首个字符的指针表示。不保存长度信息,用'\0'来标识字符串的终止。 因此相当于 char arrays[] = {'C', 'h', 'i', 'n', 'a', '\0'}; 本来应该...
  • sizeof(p)=4(32位系统) //实质是求指针类型所占字节数,32位对应4字节,64位对应8字节 sizeof(*p)=1 //实质是求指针指的内容所在字节数,*p=char[0],当然指内容大小等于1字节 sizeof(test)=10 //虽然数组...
  • JAVA数组所占内存大小的对比

    千次阅读 2015-04-23 15:33:00
    第一个是基本类型数组,第二个使用的是Float对象数组 public class SummaryModel{ private float[] summaryData; public float[] getSummaryData() { return summaryData; } public vo...
  • 作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 在考虑内存管理之前,我们要先...博主在这里整理了一些基础元素所占字节大小,防止长时间不接触而遗忘掉。 ...
  • 数组通过函数传递后为什么获取不到数组在内存中占用地址的长度? 在VS中编写如下的测试代码: #include "stdafx.h" void test(int b[]) { int mm, nn; printf("%p", "%p", "%p\n", b, &b[0], &b); print
  • 废话不多说,一起开干 1 前置知识 本次实验基于jdk8 64位以及以上版本。本机环境为jdk11 先查看一下jvm启动的默认参数,里面有2个参数值对本次实验会造成影响。 命令行: java -XX:+PrintCommandLineFlags -version ...
  • 数组名、数组地址、数组字节地址之间的关系 首先定义一个数组: int A[5]={0,1,2,3,4,5}; 此处A为数组名,看似代表整个数组,但是实际上该数组名A为数组首元素A[0]的地址,同理A+1为第二个元素a[1]的地址。意思...
  • 定义一个数组 int a[5] = {0}; 此处a的类型看似为整个数组,实际上该数组名a为一个常量指针,也就是数组第一个元素a[0]的地址,同理a+1为第二个元素a[1]的地址。在上例中,数组名的类型就是指向int类型的常量指针...
  • 字节数组

    千次阅读 2019-04-04 15:23:01
    Java语言中,中文字符所占字节数取决于字符的编码方式 编码方式 内容 字节大小 ISO8859-1 一个中文字符 1字节 ISO8859-1 一个英文字符 1字节 GB2312 一个中文字符 2字节 GB2312 一个英文字符 1字节 ...
  • 计算数组字节

    千次阅读 2015-07-17 10:31:11
    发现一个计算数组字节数的好方法 列表内容 #define TxBufferSize1 (countof(TxBuffer1) - 1) #define TxBufferSize2 (countof(TxBuffer2) - 1) #define countof(a) (sizeof(a) / sizeof(*(a))) 这样就可以直接用宏...
  • 如何计算c++中开数组的内存

    千次阅读 2019-02-26 18:19:50
    引入:在比赛中一般都会有数组的身影,但是比赛时内存是一定的,若是操作不当,那么正解也会被数组而拖累,可是如何确保自己的数组占的内存的呢??? 首先要知道你自己开数组是的类型是不一样的内存的(也就是说...
  • /*测试数组的类型及指针类型所占字节长度*/ /*******************************************************  *功能:测试各种数组(整形数组、实型数组及字符  * 型数组)及指向的不同数组的指针变量的字节长度
  • 代码如上,我理解p[0]占用的字节是4,p[1]占用的字节是1,p[2]占用的字节是3. 但是,实际情况是这样的,如下图示 ![图片说明](https://img-ask.csdn.net/upload/201711/29/1511916013_566796.png) 想...
  • 十六进制所占字节 Java中各进制表示 基本数据类型 运算符 节介绍 字节(Byte)是二进制数据的单位。一个字节通常8位(bit)长。既 1Byte = 8 bit ;字节(Byte)简写B; 十六进制所占字节 1个十六进制占4位...
  • 在C语言中(以16位PC机为例), 一个char型数据在内存中所占字节数为1; 一个int型数据在内存中所占字节数为2. 一个float型数据在内存中所占字节数为4; 一个double型数据在内存中所占字节数为8. ...
  • sizeof - 计算对象所占字节

    千次阅读 2016-12-04 16:39:05
    sizeof是一个==运算符==,而不是函数,它的功能是:==获得保证能容纳实现建立的最大对象的字节大小。...实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,==返回值跟对象、结构、数
  • 如何正确计算文本所占字节

    千次阅读 2016-05-13 11:43:48
    计算文本(字符串)所占字节数,大家第一个想到的应该就是String类的getBytes()方法,该方法返回的是字符串对应的字节数组,再计算数组的length就能够得到字符串所占字节数。例如: public static void main...
  • Java数组对象占用多少个字节?

    千次阅读 2020-12-15 17:40:27
    Length 数组占用4字节 实例数据(Instance Data) 对齐填充(Padding) 众所周知Object object = new Object()占用了16字节,然后看一下下面几个数组占用空间大小 int[] intArr = new IntArr[3]; St....
  • 数组长度计算

    万次阅读 2018-07-30 22:46:25
    可以用来计算数组的大小(数组所占字节数),但不是长度。 不过可以用它除以数组单个元素所占字节数计算长度: a[7] = {1,2,3,4,5,,6,7}; length = sizeof(a)/sizeof(a[0]); C++中可以用上述方法,不过还可以...
  • 我们可以通过String类的getBytes(String charsetName)方法来获取到字符串以指定编码方式编码后得到的字节数组,然后字节数组的长度是该字符串在指定编码方式下所占字节数。下面为一个测试示例:   ...
  • 所占字节数与OS、编译器、机器有关。同样是32位操作系统,vc++编译器中int占4个字节,turboc中则是2个字节。 本文在以下环境中实验: OS CentOS release 5.4 g++  x86_64-redhat-linux-g++ ...
  • 以 下 为 Windows NT 下 的 32 位 C++ 程 序 ,请 计算 sizeof 的值 void Func ( char str[100] ) ... Func ( char str[100] )函数中数组名作为函数...4 字节,故 sizeof( str ) 、sizeof ( p ) 都为 4。
  • * long: 长整数类型 8个字节 64位二进制 byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] * byte[6] byte[7] * float: 浮点数(小数) 4个字节 32位二进制 byte[0] byte[1] byte[2] byte[3] * ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,226
精华内容 50,090
关键字:

数组所占字节