C指针的运算-数组名的理解-指针类型的意义

 指针的运算-数组名的理解-指针类型的意义

strlen 用来求字符串的长度,关注的是字符串中的\0,计算的是\0之前出现字符的个数
strlen是库函数,只针对字符串
sizeof 只关注占用内存空间的大小,不再回内存中存放的是什么
sizeof是操作符

数组
int main()
{
	int a[] = {1,2,3,4};
	printf("%d\n", sizeof(a));//16
	//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小
	printf("%d\n", sizeof(a+0));//4
	//a不是单独放在sizeof内部,也没有取地址,所以a+0就是首元素的地址,单位是字节
	//是地址,大小就是4/8个字节
	printf("%d\n", sizeof(*a));//4
	//*a中的a就是数组首元素的地址,*a就是对首元素得地址进行解引用,找到的就是首元素
	//首元素的大小就是4个字节
	printf("%d\n", sizeof(a+1));//4
	//a+1就是第二个元素的地址,是地址就是4/8字节
	printf("%d\n", sizeof(a[1]));//4
	//计算的是第二个元素所占空间的大小
	printf("%d\n", sizeof(&a));//4
	//&a取出的数组的地址,数组的地址,也就是个地址4/8字节
	printf("%d\n", sizeof(*&a));//16
	//&a----->int (*)  *是对&a的解引用,也就是a的值
	//&a拿到的是数组名的地址,类型是int(*)[4],是一种数组指针
	//数组指针解引用找到的是数组
	//&a----->a
	printf("%d\n", sizeof(&a+1));//4
	//跳过整个数组a的第一个地址
	//&a--> int(*)[4]
	//&a+1是从数组a的地址向后跳过了一个(4个类型元素的)数组大小
	//&a+1还是地址,是地址就是4/8个字节
	printf("%d\n", sizeof(&a[0]));//4
	//就是第一个元素地址,计算的是地址的大小
	printf("%d\n", sizeof(&a[0]+1));//4
	//一个元素的地址加1 &a[0]+1---->&a[1]
	return 0;
}
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//6
	//sizeof(数组名)就是元素的个数
	printf("%d\n", sizeof(arr+0));//4
	//arr+0就是数组首元素的地址
	printf("%d\n", sizeof(*arr));//1
	//*arr是对首元素的地址解引用就是第一个元素
	//*arr-->arr[0]
	//*(arr+0)-->arr[0]
	printf("%d\n", sizeof(arr[1]));//1
	//数组的第二个元素
	printf("%d\n", sizeof(&arr));//4
	//数组的地址,是地址就是4/8字节
	printf("%d\n", sizeof(&arr+1));//4
	//&arr+1是数组后的地址
	printf("%d\n", sizeof(&arr[0] + 1));
	//&arr[0]+1是第二个元素的地址
	printf("%d\n", sizeof(arr[0]+1));//4
	//arr[0]是第一个元素字节为1但是+1之后1是int格式
	//这就会发生整型提升也就是四个字节
	printf("%d\n", sizeof(arr));
	return 0;
}

 

int main()
{
	char arr[] = { 'a','b','c','d','e','f'};
	printf("%d\n", strlen(arr));//随机值
	printf("%d\n", strlen(arr + 0));//随机值,首元素的地址+0还是首元素的地址
	/*
	printf("%d\n", strlen(*arr));//*arr--->strlen('a')---->strlen(97)--->野指针
	printf("%d\n", strlen(arr[1]));//*arr--->strlen('b')---->strlen(98)--->野指针
	*/
	printf("%d\n", strlen(&arr));//整个数组的第一个地址,随机值
	printf("%d\n", strlen(&arr+1));//整个数组的第一个地址+1,随机值-6
	//从整个数组的第一个地址+1开始数知道找到'\0'才算停止,也就是随机值-6
	printf("%d\n", strlen(&arr[0]+1));//随机值-1
	return 0;
}
int main()
{
	char arr[] = "abcdef";
	//[a b c d e f \0]
	//sizeof 计算的是变量或者数据占内存空间的大小
	printf("%d\n", sizeof(arr));//7
	printf("%d\n", sizeof(arr+0));//首元素的地址 4
	printf("%d\n", sizeof(*arr));//对首元素的地址解引用也就是a 1个字节
	printf("%d\n", sizeof(arr[1]));//数组的第二个元素 1个字节
	printf("%d\n", sizeof(&arr));//整个数组的第一个地址 4字节
	printf("%d\n", sizeof(&arr+1));//整个数组的地址+1 4字节 
	printf("%d\n", sizeof(&arr[0]+1));//数组的第二个元素b的地址 4个字节


	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr + 0));//从首元素的地址开始向后找\0 6
	/*
	printf("%d\n", strlen(*arr));//err
	printf("%d\n", strlen(arr[1]));//err
	*/
	printf("%d\n", strlen(&arr));//整个数组的首元素的地址向后找\0 6
	printf("%d\n", strlen(&arr + 1));//整个数组后的第一个地址向后找\0 随机数
	printf("%d\n", strlen(&arr[0] + 1));//数组的第二个地址向后找\0 5
	return 0;
}
 *p
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]));//首元素 
	printf("%d\n", sizeof(&p));// 二级指针的第一个地址 4
	printf("%d\n", sizeof(&p+1));//整个地址后一个地址4 
	printf("%d\n", sizeof(&p[0]+1));//第一个元素地址后的第一个地址
	printf("==============================\n");
	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p + 1));//首地址之后找\0 5
	/*
	printf("%d\n", strlen(*p));//err
	printf("%d\n", strlen(p[0]));//err
	*/
	printf("%d\n", strlen(&p));//&p的内存与p的内存不同 随机值
	printf("%d\n", strlen(&p + 1));//同上 随机值
	printf("%d\n", strlen(&p[0] + 1));//第一个元素之后找\0 5
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值