C语言进阶习题【1】指针和数组(3)——一维指针指向字符数组首元素地址

3.3 一维指针指向数组首元素地址,sizeof和strlen

#include<string.h>
int main()
{
	char* p = "abcdef";  //指针p指向字符串首地址
	printf("%d\n", sizeof(p));//p是一位指针,求指针的大小:4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(p + 1)); //指针+1,就指向了b的位置,还是指针,大小:4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(*p));//对p解引用,得到的是'a',求'a‘的大小:1字节
	printf("%d\n", sizeof(p[0]));//p[0]就是'a',求'a‘的大小:1字节
	printf("%d\n", sizeof(&p));//是二维指针,对一维指针p,取地址,大小:4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(&p + 1));//是二维指针,+1 还是指针,大小:4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(&p[0] + 1));//&p[0]得到的是'a’ +1得到的是‘b'的地址,大小:4字节/32位机器 或 8字节/64位机器



	printf("%d\n", strlen(p)); //从字符串首元素地址开始求长度,长度是:6字节
	printf("%d\n", strlen(p + 1));//p指向字符串首元素地址位置,给指针加1,指向下一个元素,就是从第二个元素开始求长度,长度是:5字节
	//printf("%d\n", strlen(*p));//对字符串首元素地址解引用,得到第一个字符'a'ASCII码是97 给strlen传97 err
	//aprintf("%d\n", strlen(p[0])); //p[0]表示字符串首元素 'a' ascii码是97 给strlen传97 err
	printf("%d\n", strlen(&p));//&p拿到的是p这个指针变量的起始地址,从这里开始求字符串长度,是随机值,因为不知道'\0'在哪儿
	printf("%d\n", strlen(&p + 1));//&p+1是跳过p变量的地址,从这里开始求字符串长度也是随机值,因为不知道'\0'在哪儿
	printf("%d\n", strlen(&p[0] + 1));//&p[0]是首元素的地址,+1是第二个元素地址'b’,从b的地址向后数字符串的长度是5

	return 0;
}


在这里插入图片描述
这里有个随机值是6,验证了下是凑巧

printf("%d\n", strlen(&p));//这里编译器打印出来还是6,但是其实这个也是随机值。我把字符串长度改变了,打印出来也是6,凑巧是6而已

在这里插入图片描述

在这里插入图片描述

3.3.1 sizeof代码分析

sizeof(p)

在这里插入图片描述

sizeof(p + 1)

在这里插入图片描述

sizeof(*p)

在这里插入图片描述

 sizeof(p[0])

在这里插入图片描述

sizeof(&p)

在这里插入图片描述

 sizeof(&p + 1))

在这里插入图片描述

 sizeof(&p[0] + 1)

在这里插入图片描述

3.3.2 strlen代码分析

 strlen(p)

在这里插入图片描述

strlen(p + 1)

在这里插入图片描述

strlen(*p)//error
strlen(p[0])//error

在这里插入图片描述

strlen(&p)

在这里插入图片描述

strlen(&p + 1)

在这里插入图片描述

strlen(&p[0] + 1)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值