数组中的strlen和sizeof

来源:互联网 发布:网络十大公会 编辑:程序博客网 时间:2024/04/30 17:50

先介绍strlen():


strlen()是函数,要在运行时才能计算。参数必须是字符型指针char*。当数组名作为参数传入时,实际上数组就退化成指针了。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。


sizeof() 是运算符,参数可以是数组(编译时分配的数组空间大小)、指针(存储该指针所用的空间大小)、类型(该类型所占的空间大小)、对象(对象的实际占用空间大小)、函数(函数的返回类型所占的空间大小,函数的返回类型不能是void)等。它的功能是获得保证能容纳实现所建立的最大对象的字节大小


关于数组在使用时的要点:

1.数组名单独放在sizeof()内部时,数组表示整个数组。

2.&数组名,数组名表示整个数组。ex:&arr表示数组的地址。

!!!除此之外所有遇到的数组名引用都是数组首元素的地址!!!

字符数组:

int main(){char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };printf("%d\n", sizeof(arr));//6整个数组大小printf("%d\n", sizeof(arr + 0));//4arr[0]地址大小printf("%d\n", sizeof(*arr));//1arr[0]的大小printf("%d\n", sizeof(arr[1]));//1arr[1]的大小printf("%d\n", sizeof(&arr));//4数组的地址(也是地址)printf("%d\n", sizeof(&arr + 1));//4整个数组地址+1,跳出数组,依然是地址printf("%d\n", sizeof(&arr[0] + 1));//4第一个元素地址+1,代表第二个元素地址printf("%d\n", strlen(arr));//从a的地址开始,遇到\0结束,生成随机数 printf("%d\n", strlen(arr + 0));//同上//printf("%d\n", strlen(*arr));//strlen()参数必须是字符型指针//printf("%d\n", strlen(arr[1]));//同上printf("%d\n", strlen(&arr));//警告!整个数组的地址,遇到\0结束,生成随机数printf("%d\n", strlen(&arr + 1));//警告!数组的地址+1,跳出数组,依然是遇到\0结束,生成随机数 printf("%d\n", strlen(&arr[0] + 1));//第一个元素地址+1,第二个元素的地址,遇到\0结束,生成随机数
return 0;
}

字符串:

char *p = "abcdef";//字符串 需注意后面有 \0printf("%d\n", sizeof(p));//4指针Pa的地址printf("%d\n", sizeof(p + 1));//4a的地址+1,b的地址printf("%d\n", sizeof(*p));//1对a地址的截引用,为char类型大小printf("%d\n", sizeof(p[0]));//1a,char类型printf("%d\n", sizeof(&p));//4p字符串的头指针printf("%d\n", sizeof(&p + 1));//4p的指针+1,跳出p,依然为指针printf("%d\n", sizeof(&p[0] + 1));//4首元素地址+1,依然是指针printf("%d\n", strlen(p));//6从a的地址,遇到\0结束,但不包括\0printf("%d\n", strlen(p + 1));//5从b的地址开始,遇到\0结束//printf("%d\n", strlen(*p));//必须为地址//printf("%d\n", strlen(p[0]));//同上printf("%d\n", strlen(&p));//p的地址,二级指针,有警告,级别不同,生成随机数printf("%d\n", strlen(&p + 1));//p的地址+1,跳出p,二级指针,有警告,级别不同,生成随机数printf("%d\n", strlen(&p[0] + 1));//5b的地址,从b开始,遇\0结
整形数组:

int a[] = { 1, 2, 3, 4 };printf("%d\n", sizeof(a));//16数组名单独放在sizeof中代表整个数组,求数组大小,以字节为单位printf("%d\n", sizeof(a + 0));//4数组名不是单独放在sizeof中,代表数组第一个元素的地址printf("%d\n", sizeof(*a));//4*为截引用符号,a代表首元素地址,对首元素地址截引用就是首元素,int类型printf("%d\n", sizeof(a + 1));//4a不是单独在sizeof中,a代表首元素地址,a+1代表第二个为元素地址,指针类型printf("%d\n", sizeof(a[1]));//4代表第二个元素,是int类型printf("%d\n", sizeof(&a));//4数组地址的地址printf("%d\n", sizeof(&a + 1));//4数组地址+1,就跳出这个数组的地址,仍然为地址printf("%d\n", sizeof(&a[0]));//4对首元素取地址,等价于aprintf("%d\n", sizeof(&a[0] + 1));//4首元素地址+1,第二个元素的地址

二维数组:

int  a[3][4] = { 0 };printf("%d\n", sizeof(a));//48数组大小printf("%d\n", sizeof(a[0][0]));//4printf("%d\n", sizeof(a[0]));//16把a[0]看成数组名,单独在sizeof中,代表整个数组a[0]printf("%d\n", sizeof(a[0] + 1));//4a[0][1]地址printf("%d\n", sizeof(a + 1));//4第二行地址a[1][]printf("%d\n", sizeof(&a[0] + 1));//4对第一行元素取地址,+1后还是地址,等价于a+1printf("%d\n", sizeof(*a));//16a代表第一行元素,*截引用,为第一行元素printf("%d\n", sizeof(a[3]));//16越界,但是编译不占内存,大小为16  


原创粉丝点击