关于数组我们必须会的的运算
来源:互联网 发布:啄木鸟图片下载器mac 编辑:程序博客网 时间:2024/06/08 13:11
Sizeof与Strlen的区别
一、sizeof
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
**************
二、strlen
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
一、sizeof
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
**************
二、strlen
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
********************************************************************************************************************************************************************************************
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <string.h>int main(){int arr[] = {1, 2, 3, 4};char arr1[] = {'a','b','c','d'};char *p = "abcdefgf";int a[3][4] = {0}; /******************************************************* ****************一维数组 int型sizeof求解**************** ********************************************************/printf("%d\n", sizeof(arr)); //sizeof(数组名)表示求整个数组的大小printf("%d\n", sizeof(arr+0)); //表示数组首元素的地址printf("%d\n", sizeof(*arr)); //表示数组首元素的大小printf("%d\n", sizeof(arr+1)); //表示数组第二个元素的地址printf("%d\n", sizeof(arr[1]));//表示数组第一个元素的大小printf("%d\n", sizeof(&arr)); //表示整个数组的地址,其实还是首元素的地址printf("%d\n", sizeof(&arr+1));//表示跳过这个数组的地址,还是表示首地址printf("%d\n", sizeof(&arr[0]));//表示首元素的地址printf("%d\n", sizeof(&arr[0]+1));//表示第二个元素的地址/*********************************************************************字符数组 char型 利用sizeof求解***********************************************************************/ printf("%d\n", sizeof(arr1)); //求整个数组的大小,因为是char型,所以大小是4printf("%d\n", sizeof(arr1+0)); //求首元素的地址printf("%d\n", sizeof(*arr1)); //求首元素的大小printf("%d\n", sizeof(arr1[1])); //求第二个元素的大小printf("%d\n", sizeof(&arr1)); //求整个数组的地址,其实还是首元素的地址printf("%d\n", sizeof(&arr1+1)); //&arr1+1表示跳过了这个数组,但还是求地址printf("%d\n", sizeof(&arr1[0]+1)); //求第二个元素的地址/*********************************************************************字符数组 char型 利用strlen求解***********************************************************************/ printf("%d\n", strlen(arr1)); // strlen求长度会在遇到\0结束,所以会产生一个随机值xprintf("%d\n", strlen(arr1+0)); //产生一个随机值x//printf("%d\n", strlen(*arr1)); //非法操作,出错//printf("%d\n", strlen(arr1[1])); //非法操作,出错printf("%d\n", strlen(&arr1)); //求整个数组的长度,遇到\0结束,所以产生一个随机值,printf("%d\n", strlen(&arr1+1)); //跳过这个数组求长度,长度为x-4(针对本数组)printf("%d\n", strlen(&arr1[0]+1)); //从第二个元素开始求长度,也会在遇到\0结束,所以为x-1/*********************************************************************字符串数组 char型 利用sizeof求解***********************************************************************/ printf("%d\n", sizeof(p)); // 求首元素的地址 printf("%d\n", sizeof(p+1)); //求第二个元素的地址 printf("%d\n", sizeof(*p)); //求第一个元素的大小 printf("%d\n", sizeof(p[0])); //求首元素大小 printf("%d\n", sizeof(&p)); //求首地址 printf("%d\n", sizeof(&p+1)); //求下一个字符串的地址 printf("%d\n", sizeof(&p[0]+1)); //求第二个元素的地址/*********************************************************************字符串数组 char型 利用strlen求解***********************************************************************/ printf("%d\n", strlen(p)); // 求字符串的长度 printf("%d\n", strlen(p+1)); // 从第二个元素开始求字符串的长度 //printf("%d\n", strlen(*p)); // 出错 //printf("%d\n", strlen(p[0])); //出错 printf("%d\n", strlen(&p)); // 求首元素的地址长度,随机值 printf("%d\n", strlen(&p+1)); // 求跳过本字符串地址,随机值 printf("%d\n", strlen(&p[0]+1)); //求从第二个元素开始,求长度/*********************************************************************二维数组 int型 利用sizeof求解***********************************************************************/ printf("%d\n", sizeof(a)); //求整个二维数组大小 printf("%d\n", sizeof(a[0][0])); //求首元素的大小 printf("%d\n", sizeof(a[0])); //将二维数组看作一维数组,求首元素的大小 printf("%d\n", sizeof(a[0]+1)); //看作一维数组求第二个元素地址 printf("%d\n", sizeof(a+1)); // 看作一维数组求第二个元素地址大小 printf("%d\n", sizeof(&a[0]+1)); //第二个元素地址 printf("%d\n", sizeof(*a)); //求一维数组首元素大小 printf("%d\n", sizeof(a[3])); //将二维数组看作一维数组,求一维数组大小return 0;}总结:sizeof(数组名),这里的数组名表示整个数组&数组名,这里的数组名也表示整个数组
0 0
- 关于数组我们必须会的的运算
- 关于数组必须学会的运算
- 关于linux必须会的东西
- 关于指针运算的小体会
- 我们会幸福的
- 关于学习架构,必须会的几点技术
- 我们禁不住会去感动 关于硬盘的爱情故事
- 年轻的我们必须懂得
- 我们会有我们的天长地久
- 工作中必须会的
- 程序员必须会的英文单词
- C语言中关于数组的运算
- 关于多维数组的运算问题
- 我们的明天会更好
- 我们常见的数组
- C中关于数组以及数组的简单运算
- 我们必须作出艰难的选择。
- 我们为什么必须会git和maven
- 蓝桥 奇怪的分式
- POJO、JavaBeans、EJB的区别
- All in All UVA
- C#网络编程初步之TCP
- 【TOP100】100个中国大数据应用最佳实践案例—为您打开万亿元大数据产业的财富之门
- 关于数组我们必须会的的运算
- 我的一些简单的shell脚本实例
- 杂凑密码——摘要算法简介
- 滴答定时器
- 数据库第3天
- TensorFlow 及 Keras 在window上的安装
- poj1008 -- 玛雅历
- /index.jsp(27,4) No tag "" defined in tag library imported with prefix "s"
- win10环境下安装ubuntu出现的问题