博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组的练习
阅读量:4116 次
发布时间:2019-05-25

本文共 5077 字,大约阅读时间需要 16 分钟。



Sizeof与Strlen的区别:

1.sizeof是运算符,strlen是函数。

2.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小;sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

下面看一写运算:

1.一维数组

#include
#include
int main(){ int a[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(a));//整个数组的大小 16 printf("%d\n", sizeof(a + 0));//首元素的地址,&a[0]的大小; 4 printf("%d\n", sizeof(*a));//第一个元素,a[0],则占空间为4byte; 4 printf("%d\n", sizeof(a + 1));//数组下一元素的地址,&a[1]的大小;4 printf("%d\n", sizeof(a[1]));//第二个元素; 4 printf("%d\n", sizeof(&a));//数组的地址,即指针的大小; 4 printf("%d\n", sizeof(*&a));//*(数组地址) 16 printf("%d\n", sizeof(&a + 1));//下一个数组的首地址;*(a+1)的大小 4 printf("%d\n", sizeof(&a[0]));//a[0]的地址; 4 printf("%d\n", sizeof(&a[0] + 1));//a[1]的地址; 4 system("pause"); return 0;}

2,字符数组

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };		printf("%d\n", sizeof(arr));//整个数组的大小                      6		printf("%d\n", sizeof(arr + 0));//首元素的地址,&arr[0]的大小;       4		printf("%d\n", sizeof(*arr));//第一个元素,arr[0];                 1		printf("%d\n", sizeof(arr + 1));//数组下一元素的地址,&arr[1]的大小;4		printf("%d\n", sizeof(arr[1]));//第二个元素;                       1		printf("%d\n", sizeof(&arr));//数组的地址,即指针的大小;          4		printf("%d\n", sizeof(*&arr));//*(数组地址)                        6 		printf("%d\n", sizeof(&arr + 1));//下一个数组的首地址;*(arr+1)的大小 4		printf("%d\n", sizeof(&arr[0]));//arr[0]的地址;                      4 		printf("%d\n", sizeof(&arr[0] + 1));//arr[1]的地址;                  4		system("pause");		return 0;

int main(){	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };	printf("%d\n", strlen(arr));//arr的长度,strlen以\0结束,但strlen不包括\0。长度是随机值19	printf("%d\n", strlen(arr + 0));//首元素地址;  随机值19;	printf("%d\n", strlen(&arr[0]));//首元素地址19	//printf("%d\n", strlen(*arr));//“const char *”与“char”(arr的类型)的间接级别不同,不匹配;    	//printf("%d\n", strlen(arr[1]));//“const char *”与“char”的间接级别不同	printf("%d\n", strlen(&arr));//“const char *”与“char (*)[6]”的间接级别不同,有警告;数组的地址在数值上等于首元素相同;19	printf("%d\n", strlen(*&arr));//*(数组的地址);   19	printf("%d\n", strlen(&arr + 1));//“const char *”与“char (*)[6]”的间接级别不同 strlen(arr)-6=13	printf("%d\n", strlen(&arr[0] + 1));//下一个元素地址strlen(arr)-1=18	printf("%d\n", strlen(arr + 1));//下一个元素地址;18  	system("pause");	return 0;}

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

char arr[] = {"abcdef" };	printf("%d\n", sizeof(arr));//整个数组的大小                      7	printf("%d\n", sizeof(arr + 0));//首元素的地址,&arr[0]的大小;     4	printf("%d\n", sizeof(*arr));//第一个元素,arr[0];                1	printf("%d\n", sizeof(arr[1]));//第二个元素;                       1	printf("%d\n", sizeof(arr + 1));//数组下一元素的地址,&arr[1]的大小;4	printf("%d\n", sizeof(&arr));//数组的地址,即指针的大小;          4	printf("%d\n", sizeof(*&arr));//*(数组地址)                       7	printf("%d\n", sizeof(&arr + 1));//下一个数组的首地址;*(arr+1)的大小 4	printf("%d\n", sizeof(&arr[0]));//arr[0]的地址;                    4	printf("%d\n", sizeof(&arr[0] + 1));//arr[1]的地址;                 4	system("pause");	return 0;

char arr[] = { "abcdef" };		printf("%d\n", strlen(arr)); //arr的长度,strlen以\0结束,但strlen不包括\0。 6		printf("%d\n", strlen(arr + 0));//首元素地址;     6                          		printf("%d\n", strlen(&arr[0]));//首元素地址       6		//printf("%d\n", strlen(*arr)) ;//首元素,“const char *”与“char”(arr的类型)的间接级别不同,不匹配;    		//printf("%d\n", strlen(arr[1]));//“const char *”与“char”的间接级别不同		printf("%d\n", strlen(&arr));//“const char *”与“char (*)[6]”的间接级别不同,有警告;数组的地址在数值上等于首元素相同;6		printf("%d\n", strlen(*&arr));//*(数组的地址);   6		printf("%d\n", strlen(&arr + 1));//“const char *”与“char (*)[6]”的间接级别不同 ,下一个数组的地址;随机值		printf("%d\n", strlen(&arr[0] + 1));//下一个元素地址strlen(arr)-1=5		printf("%d\n", strlen(arr + 1));//下一个元素地址;  5		system("pause");		return 0;

 

int main(){	char *p = "abcdef";	printf("%d\n", sizeof(p));//指针变量; 4	printf("%d\n", sizeof(p+1));//指针加1就是加上所指类型的大小; 4	printf("%d\n", sizeof(*p));//首元素;1	printf("%d\n", sizeof(p[0]));//&a[0];1	printf("%d\n", sizeof(&p));//指针变量的地址;4	printf("%d\n", sizeof(&p+1));//&p是二级指针,char**;4	printf("%d\n", sizeof(&p[0]+1));// 4	printf("%d\n", strlen(p));//指针变量;6	printf("%d\n", strlen(p + 1));//       5	//printf("%d\n", strlen(*p));//首元素;“const char *”与“char”的间接级别不同;	//printf("%d\n", strlen(p[0]));//&a[0]=arr,“const char *”与“char ”的间接级别不同;	printf("%d\n", strlen(&p));//指针变量的地址,“const char *”与“char **”的间接级别不同; 随机值 3	printf("%d\n", strlen(&p + 1));//&p是二级指针,char**,“const char *”与“char **”的间接级别不同; 随机值  11	printf("%d\n", strlen(&p[0] + 1));// 5	system("pause");	return 0;}

3.二维数组

int a[3][4] = { 0 };	printf("%d\n", sizeof(a));//整个数组的大小;  12*4=48	printf("%d\n", sizeof(a[0]));//首元素的大小——首数组的大小;16	printf("%d\n", sizeof(a[0][0]));//首数组的首元素大小;      4	printf("%d\n", sizeof(a[0]+1));//下一个元素a[0][1];         4	printf("%d\n", sizeof(a+1));//&a[1],第二个元素的地址——第二个数组的地址  4	printf("%d\n", sizeof(&a[0]+1));//下一个元素的地址——下一个数组的地址;(数组指针)  4	printf("%d\n", sizeof(*a));//a[0];   16	printf("%d\n", sizeof(a[3]));//虽然下标不存在(不允许写入),允许访问  16

转载地址:http://kmypi.baihongyu.com/

你可能感兴趣的文章
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第四章 - 程序计数器
查看>>
第七章 - 本地方法栈
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
JDBC核心技术 - 下篇
查看>>
一篇搞懂Java反射机制
查看>>
【2021-MOOC-浙江大学-陈越、何钦铭-数据结构】树
查看>>
MySQL主从复制不一致的原因以及解决方法
查看>>
RedisTemplate的key默认序列化器问题
查看>>
序列化与自定义序列化
查看>>
ThreadLocal
查看>>
从Executor接口设计看设计模式之最少知识法则
查看>>