C语言指针(sizeof,strlen)练习(1)

C语言指针题目练习(1)

sizeof(数组名) ----表示计算整个数组的大小
&数组名 数组名表示整个数组,取出的是整个数组的地址
除此之外,所有数组名都是数组首元素的地址

//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));  //  a在sizeof()单独出现表示整个数组大小,4*4=16

printf("%d\n",sizeof(a+0)); // 不是单独的a了,而是a+0,表示是第一个元素的地址,指针类型大小4或者8个字节

printf("%d\n",sizeof(*a)); //  *a是数组第一个元素,表示取第一个元素的大小,4个字节

printf("%d\n",sizeof(a+1)); // a+1表示第二个元素的地址,指针类型大小4个或8个字节

printf("%d\n",sizeof(a[1])); a[1]是2,求2的大小,是4个字节

printf("%d\n",sizeof(&a));  //&a表示取出整个数组的地址 地址是指针类型4或8个字节

printf("%d\n",sizeof(*&a)); //&a取出整个数组的地址,解引用之后指向整个数组,整个数组大小为16个字节,就比如整形指针解引用后指向一个整形。

printf("%d\n",sizeof(&a+1)); //&a+1后是跳过整个数组来到数组后面空间,指针类型大小4个或8个字节

printf("%d\n",sizeof(&a[0])); //a[0]是1,&1的地址,指针类型大小4个或8个字节

printf("%d\n",sizeof(&a[0]+1)); ///a[0]是1,&1的地址+1,跳到第二个元素的地址,指针类型大小4个或8个字节

在这里插入图片描述

//字符数组
char arr[] = {'a','b','c','d','e','f'};
//这里字符数组放的是abcdef
printf("%d\n", sizeof(arr)); //表示整个数组的大小,6*1=6

printf("%d\n", sizeof(arr+0)); //arr没有单独使用,表示首元素地址,指针类型是4个或8个字节

printf("%d\n", sizeof(*arr)); //arr表示首元素地址,解引用找到第一个元素,char为1个字节

printf("%d\n", sizeof(arr[1])); //b的大小是1个字节

printf("%d\n", sizeof(&arr)); //表示整个数组的地址,地址的大小是4个或8个字节

printf("%d\n", sizeof(&arr+1)); //跳过整个数组,来到下一个数组的地址,指针类型是4个或8个字节

printf("%d\n", sizeof(&arr[0]+1)); //b的地址+1 ,跳过char*大小,来到下一个元素的地址,指针类型是4个或8个字节

printf("%d\n", strlen(arr)); //没有\0,是随机值

printf("%d\n", strlen(arr+0)); //没有\0,是随机值

// int strlen(const char* str)
printf("%d\n", strlen(*arr)); //arr是首元素地址,解引用得到a,把a的ASCII码值97传入函数中,97被强制类型转换为地址,所以是error

printf("%d\n", strlen(arr[1]));//跟上面同理

printf("%d\n", strlen(&arr));//&arr传入的是整个数组的地址,本应该是用数组指针接收的,现在被强制转换为char*指针,所以是随机值

printf("%d\n", strlen(&arr+1));//跳转到下一个数组,随机值

printf("%d\n", strlen(&arr[0]+1));//b的地址往后走没有遇到\0,所以是随机值

在这里插入图片描述在这里插入图片描述

	char arr[] = "abcdef";
	//这里字符数组里放的是abcdef\0
	
	printf("%d\n", sizeof(arr)); //整个数组的大小,7*1=7
	
	printf("%d\n", sizeof(arr+0)); //首元素地址,指针类型是4个或8个字节 4/8
	
	printf("%d\n", sizeof(*arr)); //解引用第一个元素的地址,得到a,a是char类型,大小为1
	
	printf("%d\n", sizeof(arr[1])); //b的大小为1
	
	printf("%d\n", sizeof(&arr)); //取出整个数组的地址,指针类型是4个或8个字节 4/8
	
	printf("%d\n", sizeof(&arr+1)); //跳转到下一个数组的地址,指针类型是4个或8个字节 4/8
	printf("%d\n", sizeof(&arr[0]+1)); //a的地址+1 跳到下一个元素地址,指针类型是4个或8个字节 4/8
	
	printf("%d\n", strlen(arr)); //字符串长度到\0停止,长度为6
	
	printf("%d\n", strlen(arr+0)); //首元素地址往后数,到\0停止,长度为6
	
	printf("%d\n", strlen(*arr)); //arr是首元素地址,解引用把a传进入,传进入的ASCII码,所以是error
	
	printf("%d\n", strlen(arr[1]));//上面同理
	printf("%d\n", strlen(&arr));//&arr传入的是整个数组的地址,整个数组的地址也是从第一个元素开始指向的,往后数遇到\0停止,所以是6
	
	printf("%d\n", strlen(&arr+1)); //数组+1,跳到下一个数组地址,长度随机值
	
	printf("%d\n", strlen(&arr[0]+1)); //首元素地址+1,跳到下一个元素地址,遇到\0停止,长度为5

在这里插入图片描述
在这里插入图片描述

	char *p = "abcdef";
	printf("%d\n", sizeof(p)); //p是一个char*指针,指针类型是4个或8个字节 4/8
	
	printf("%d\n", sizeof(p+1));p+1找到下一个元素的地址,指针类型是4个或8个字节 4/8
	
	printf("%d\n", sizeof(*p)); //*p解引用找到a,大小为1
	
	printf("%d\n", sizeof(p[0]));//p[0]=a,大小为1
	
	printf("%d\n", sizeof(&p));//p是一个指针,取指针的地址还是一个指针,指针类型是4个或8个字节 4/8
	
	printf("%d\n", sizeof(&p+1)); //p+1跳过一个p,指针类型是4个或8个字节 4/8
	
	printf("%d\n", sizeof(&p[0]+1)); //指向下一个元素地址,指针类型是4个或8个字节 4/8
	
	printf("%d\n", strlen(p)); //p是一个指针变量,传入strlen(),p会往后加,直到遇到\0,长度为6
	
	printf("%d\n", strlen(p+1)); //p是一个指针变量,+1跳过一个char*, 长度为5
	
	printf("%d\n", strlen(*p));//传入的是a,ASCII码97,所以是error
	
	printf("%d\n", strlen(p[0]));//error
	
	printf("%d\n", strlen(&p)); //p是一个指针变量,&p是指针变量的地址,是一个指针不知道里面存的是什么,所以是随机值
	
	printf("%d\n", strlen(&p+1)); //指向下一个数组的地址,不知道存放的是什么,所以是随机值
	
	printf("%d\n", strlen(&p[0]+1)); //a的地址+1,指向下一个元素地址,向后数遇到
\0停止,长度为5

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值