天天看点

C语言中 数组的运算及sizeof()和strlen()操作符的简单介绍

sizeof()

sizeof 在是用来判断数据类型或者表达式的长度符,(注意:它和strlen不一样它只是一个操作符,而strlen()为一个函数)

MSDN上的解释为:

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.

语法形式:

sizeof(object);//sizeof(对象)

sizeof(type_name);//sizeof(类型)

所以,

int i;

sizeof( i ); // ok

sizeof( int ); // ok

strlen()

strlen() 是计算字符串的实际长度的函数

头文件 : string.h

格式 :strlen (字符数组名)

功能 :计算字符串s的(unsigned int型)长度,不包括’\0’在内

说明 :返回s的长度,不包括结束符NULL

sizeof和strlen的区别

strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。

而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。

⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。

该类型保证能容纳实现所建立的最大对象的字节大小。

⒉sizeof是操作符(关键字),strlen是函数。

⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。

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

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

char str[20]=”0123456789”;

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

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

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

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

⒏当适用了于一个结构类型时或变量, sizeof 返回实际的大小,

当适用一静态地空间数组, sizeof 归还全部数组的尺寸。

sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

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

如:

fun(char [8])

fun(char [])

都等价于 fun(char *)

数组的运算

接下来我们用sizeof进行数组运算(//后为运行结果)

需要知道的是只有这两种情况数组名才代表整个数组

int arr[5]={0};

1、sizeof直接加数组名sizeof(arr);

2、&数组名 &arr

代码1:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};(char类型1个字节大小)

char arr[] = {'a','b','c','d','e','f'};
        printf("%d\n", sizeof(arr));//6 整个数组大小
        printf("%d\n", sizeof(arr+));//4 第一个元素的地址
        printf("%d\n", sizeof(*arr));//1 第一个元素大小
        printf("%d\n", sizeof(arr[]));//1 第二个元素大小
        printf("%d\n", sizeof(&arr));//4 数组的地址大小
        printf("%d\n", sizeof(&arr+));//4 整个数组之后下一个空间的地址+1是偏移了一个数组的大小即f之后,但它仍是个指针,指针的大小永远为4
        printf("%d\n", sizeof(&arr[]+));//4 第一个元素的地址
           

代码2:char arr[] = “abcdef”;

char arr[] = "abcdef";
        printf("%d\n", sizeof(arr));//7 整个字符串大小 多了\0
        printf("%d\n", sizeof(arr+));// 4第一个元素a的地址大小
        printf("%d\n", sizeof(*arr));//1第一个元素大小
        printf("%d\n", sizeof(arr[]));// 1第二个元素大小
        printf("%d\n", sizeof(&arr));// 4整个字符串地址的大小
        printf("%d\n", sizeof(&arr+));// 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
        printf("%d\n", sizeof(&arr[]+));// 4第二个元素b地址的大小
           

代码3:int a[] = { 1, 2, 3, 4 };(int类型4个字节大小)

int a[] = { , , ,  };
    printf("%d\n", sizeof(a + ));//4第一个元素地址的大小
    printf("%d\n", sizeof(*a));//4 第一个元素的大小
    printf("%d\n", sizeof(a + ));//4 第二个元素地址大小
    printf("%d\n", sizeof(a[]));//4 第二个元素大小
    printf("%d\n", sizeof(&a));//4 整个数组地址大小
    printf("%d\n", sizeof(*&a));//16 整个数组大小
    printf("%d\n", sizeof(&a + ));//4 整个数组之后下一个空间的地址+1是偏移了一个数组的大小即4之后,但它仍是个指针,指针的大小永远为4
    printf("%d\n", sizeof(&a[]));//4 第一个元素地址的大小
    printf("%d\n", sizeof(&a[] + ));//4  第二个元素地址的大小
           

代码4:char *p = “abcdef”;

char *p = "abcdef";
    printf("%d\n", sizeof(p));//4 整个字符串地址大小
    printf("%d\n", sizeof(p+));//4 第二个元素地址的大小
    printf("%d\n", sizeof(*p));//1 第一个元素a大小
    printf("%d\n", sizeof(p[]));//1第一个元素a大小
    printf("%d\n", sizeof(&p));//4 第一个元素地址的大小
    printf("%d\n", sizeof(&p+));//4 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
    printf("%d\n", sizeof(&p[]+));//4 第二个元素大小
           
接下来我们用strlen进行数组运算(//后为运行结果)

代码1:char *p = “abcdef”;

char *p = "abcdef";
        printf("%d\n", strlen(p));//6 整个字符串长度 不包括\0
        printf("%d\n", strlen(p+));//5 第二个元素开始字符串长度
        printf("%d\n", strlen(*p));//err *p是一个具体的值 系统崩溃
        printf("%d\n", strlen(p[]));//err 同上
        printf("%d\n", strlen(&p));//x 随机值 p地址(用二级指针来存放p的地址,也就是地址的地址)之后不知何时遇到\0停止
        printf("%d\n", strlen(&p+));//x p地址之后的空间不知何时遇到\0停止
        printf("%d\n", strlen(&p[]+));//5 第二个元素开始字符串长度
           

代码2:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};

char arr[] = {'a','b','c','d','e','f'};
        printf("%d\n", strlen(arr));//x 随机值 不知何时有\0停止
        printf("%d\n", strlen(arr+));//x 同上
        printf("%d\n", strlen(*arr));//err *arr是一个值 系统崩溃
        printf("%d\n", strlen(arr[]));//err同上
        printf("%d\n", strlen(&arr));//x 
        printf("%d\n", strlen(&arr+));//x 
        printf("%d\n", strlen(&arr[]+));//x 
           

代码3:char arr[] = “abcdef”;

char arr[] = "abcdef";
        printf("%d\n", strlen(arr));// 6 整个字符串长度不包括\0
        printf("%d\n", strlen(arr+));// 6 整个字符串长的
        printf("%d\n", strlen(*arr));// err 崩溃
        printf("%d\n", strlen(arr[]));//err 崩溃
        printf("%d\n", strlen(&arr));// 6 字符串长度
        printf("%d\n", strlen(&arr+));//x 随机值偏移了整个数组大小 不知何时遇到\0停止
        printf("%d\n", strlen(&arr[]+));// 5 第二个元素开始字符串长度
           

继续阅读