sizeof、 strlen的打印-往死里学指针4

知识点

数组名的三种情况:

  • sizeof(数组名)- - -数组名单独放在sizeof内部表示整个数组,计算的是整个数组的大小
  • &数组名 - - -数组名表示整个数组,取出的是整个数组的地址
  • 除此之外:所有的数组名都是数组首元素的地址(不是特殊情况)

sizeof需要的知识点:

  • 计算地址的大小- -4/8
  • 指针的大小- -4/8
  • 计算整个数组大小:假如类型为int ,整型字节4乘于4个元素

strlen需要的知识点:

  • 数组的地址l类型为char ( * ) 【6】,传到strlen的函数里面会变为字符的地址char * (代表数组首元素的地址)

  • strlen(),括号里面需要一个地址传给strlen函数,如果是元素的话,就会被识别成ascall码值并且当作地址传给strlen就会出错

在这里插入图片描述

整型数组 、sizeof

int main()
{
	int a[] = { 1,2,3,4 };//4*4=16
	printf("%d\n", sizeof(a));//16
	printf("%d\n", sizeof(a + 0));//4/8 
	printf("%d\n", sizeof(*a));//4  
	printf("%d\n", sizeof(a + 1);//4/8
	printf("%d\n", sizeof(a[1]));//4

	printf("%d\n", sizeof(&a)); //4/8
	printf("%d\n", sizeof(* &a));//16 //&a -- int(*p)[4] = &a;
	printf("%d\n", sizeof(&a + 1));//4/8 
	printf("%d\n", sizeof(&a[0]));//4/8
	printf("%d\n", sizeof(&a[0] + 1));//4/8
	}

解释:
1sizeof(a)- -数组名单独放在sizeof内部表示整个数组,计算整个数组大小 4*4=16(4个元素乘于4个字节(整型的字节为4))
2不是特殊情况(没有单独放在sizeof内部也没有&),a就是数组名就是首元素地址- - 地址- -4/8
3sizeof( * a)- - -不是特殊情况,a就是数组名就是首元素地址,被解引用访问数组第一个元素,计算第一个元素的大小(不能看成指针4/8)- -4(字节)
4不是上述两种情况,a就是数组名就是首元素地址,a+1就是第二个元素的地址- -地址- -4/8
5 sizeof(a[1])- - -此时表示的是数组第二个元素,计算第二个元素的大小- -4

6 &a- -数组名表示整个数组,取出的是整个数组的地址- -地址–4/8
7 &a是数组的地址, * 解引用找到整个数组 (相当于 * 和&抵消)–所有sizeof( * &a)计算数组的大小
8 &a数组的地址,数组的地址加1跳过整个数组之后空间(第二个箭头开始)的地址- -还是地址- - 4/8
在这里插入图片描述
9第一个元素的地址- 地址- -4/8
10 第二个元素的地址- -4/8

字符数组 sizeof

    char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//6
	printf("%d\n", sizeof(arr + 0));//4/8
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4/8
	printf("%d\n", sizeof(&arr + 1));//4/8
	printf("%d\n", sizeof(&arr[0] + 1));//4/8

1sizeof(arr)- -计算数组总大小 char类型字节1乘于元素个数6
2sizeof(arr+0)- -不是特殊情况,则arr在这里表示数组名,数组首元素的地址- -4/8
3数组名表示首元素的地址解引用找到首元素的a- - - a的大小为一个字节- - -1
4第二个元素的大小- 1
5数组的地址 4/8
6跳过整个数组的地址,之后空间的地址- -4/8
7第一个元素的地址(类型为int * )int * 加1再指向b的地址- -4/8
拓展

  • *(arr+0)首元素地址解引用找到第一个元素的大小为1个字节- 放sizeof 里面是 1
  • 如果是&arr+2,那么跳过多少个字节呀? 12个,因为跳过两个数组指向2且char的字节为1
  • 跳过几个字节还要看类型

在这里插入图片描述

字符数组 strlen - 找\0

     char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));//随机值
	printf("%d\n", strlen(arr + 0));//随机值
	//printf("%d\n", strlen(*arr));//err
	//printf("%d\n", strlen(arr[1]));//err
	printf("%d\n", strlen(&arr));//随机值
	printf("%d\n", strlen(&arr + 1));//随机值-6
	printf("%d\n", strlen(&arr[0] + 1));//随机值-1

strlen函数

在这里插入图片描述
1 在这里数组名为数组首元素的地址,往后走找不到\0
2 和1一样
3 数组首元素地址解引用找到第一个元素字符 a,地址为 97,传给strlen这个函数的时候地址找不到会出错err
4 第二个元素放的是字符b,它的地址98,传到strlen这个函数里会出错
5 数组的地址l类型为char ( * ) 【6】,传到strlen的函数里面会变为字符的地址char * (代表数组首元素的地址)- - -没有\0- - -随机值
6 跳过一个数组,不知道那个数组存储什么,随机值,或者随机值-6
7 b的地址,随机值或者随机值-1

字符串 sizeof

  [a b c d e f \0] - - 字符串自带\0
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7
	printf("%d\n", sizeof(arr + 0));//4/8
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4/8  char(*)[7]
	printf("%d\n", sizeof(&arr + 1));//4/8 
	printf("%d\n", sizeof(&arr[0] + 1));//4/8

1 arr单独放在sizeof内部- -数组的总大小 - -7个元素 乘于1(字节)
2 数组首元素地址 – 地址–4/8
3第一个元素地址解引用找到第一个元素- - 1
4第二个元素 - -1
5整个数组地址 - -4/8
6跳到几个字符到\0后面,但还是地址4/8
7第一个元素的地址+1- -第二个元素地址- -地址- -4/8

字符串strlen

     char arr[] = "abcdef";
	//[a b c d e f \0]
	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr + 0));//6
	//printf("%d\n", strlen(*arr));//err
	//printf("%d\n", strlen(arr[1]));//err
	printf("%d\n", strlen(&arr));//6
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//5

1 arr没有单独放在sizeof内部也没有&arr- - 数组名首元素地址- - 找\0 不算\0 - - 为6
2 arr没有单独放在sizeof内部,数组名首元素地址 - - 找\0不算\0- -为6
3 err- - 传给strlen函数是元素a的地址97,不能找到就出错
4 err- -传的是元素b的地址98
5 虽然是整个数组的地址,但是传到strlen函数里面就会变为首元素的地址- -找\0不算\0- -为6
6 跳过一个数组后面的数组不确定\0- -随机值
7 从b开始往后数- -5

指针 sizeof

	char* p = "abcdef";
	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));

1 算的是一个指针变量(p)的大小,指针大小—4/8
2 p为a的地址加1为b的地址- -地址- -4/8
3 p指向a的地址, * p(解引用)指向字节a - - 1
4 p[0] - - * (p+0) - - 和3一样 - - -1
5 地址- -4/8
6 地址- -4/8
 在这里插入图片描述

7a的地址加1为b的地址- -地址- -4/8

指针 strlen

	char* p = "abcdef";
	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));

1 传过去的是首字符,从首字符开始算直到\0 - -6
2 (p+1)指向的是b的地址,b向后数找到\0- -5
3 * p找到的是元素a(ascall码值为97当作地址)传给strlen函数 不知道是什么会出错
4 找到第一个元素 和3一样--err
5 从p里面开始数,p里面不知道是什么(p虽然指向字符串的首地址,但p是有自己的空间的)- -随机值
6 &p+1之后是什么不知道- -随机值
7第一个元素地址+1=b的地址,从b开始数- -5
拓展
p里面放的地址,地址里可能有\0(00)

二维数组、 sizeof

知识点:
二维数组里的数组名有:

  • a表示整个二维数组的数组名
  • 当a它不是特殊情况的时候, 二维数组的数组名表示首元素地址即表示的是第一行的地址
  • a[i]表示第i行的数组名
  • 当a[i]不单独不是特殊情况的时候,就表示第i行的数组名即表示第i行的首元素(a[i][0])的地址
    注:因为为数组名所以放到sizeof里面和为&数组名时要注意
    在这里插入图片描述
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48 = 3*4*sizeof(int)
	printf("%d\n", sizeof(a[0][0]));//4 
	printf("%d\n", sizeof(a[0]));//16
	printf("%d\n", sizeof(a[0] + 1));//4/8
	printf("%d\n", sizeof(*(a[0] + 1)));//4 
	printf("%d\n", sizeof(a + 1));//4 /8
	printf("%d\n", sizeof(*(a + 1)));//16 
	printf("%d\n", sizeof(&a[0] + 1));//4/8
	printf("%d\n", sizeof(*(&a[0] + 1)));//16
	printf("%d\n", sizeof(*a));//16 
	printf("%d\n", sizeof(a[3]));//16 
	printf("%d\n", sizeof(a[-1]));
	return 0;
}

1  12个元素乘于sizeof(int)- -48
2  第一行第一个元素的大小- -a[0][0]- -4(int类型字节为4)
3 a[0]单独放在sizeof内部可以理解为第一一行数组名,sizeof(第一行数组名)- -计算第一行数组的大小 --4乘于4- -16
4 a[0]不是单独放在sizeof内部也没有取地址,所以它表示第一行数组首元素a[0][0]的地址,加1指向第一行第二个元素的地址- -地址- -4
5 a[0]不是特殊情况,a[0]为第一行的数组名即第一行的首元素(a[0][0])的地址-加1找到第二个元素的地址-再解引用找到第一行第二个元素-整型- -4
6 a二维数组名,,并没有取地址,也没有单独放在sizeof内部-所以a代表二维数组首元素地址- -第一行的地址- -加1- -第二行地址
7 第二行的地址解引用,找到第二行的元素- -16
 也可以看成a[1]- -和3一样解释
8 a[0]是第一行数组名,数组名取地址就是第一行的地址,第一行的地址加1为第二行的地址- -地址- -4
 可以看成和6一样的解释
9第二行地址解引用- -就是第二行,计算的计算第二行的的元素- -16
 可以看成和7一样的解释
10 a作为二维数组的数组名,没有单独放到sizeof内部,a代表第一行的地址- -解引用得到第一行的大小- -16
  *(a+0)–>a[0 ]第一行数组名
11 因为 sizeof(3+5)- -3+5为int类型- -为4
 所以a[3]- - ->int[4]- - -sizeof不会访问到第四行,只看到int就会直接打印4,其实不存在也能通过类型来访问大小
12 sizeof(a[-1]) - -16

sizeof- -不会访问表达式的内部
在这里插入图片描述
整个表达式只有s说了算,所以还是看它是是short类型- -2个字节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值