指针三部曲(三)


来到了指针的最后一曲,准备好了吗?

1. sizeof 和 strlen 题目解析

sizeof : sizeof() 是一个判断数据类型或者表达式长度的运算符。
strlen:计算给定字符串的长度,从某个位置向后扫描,直到遇到 ’ \0 ‘停止,计算的长度不包括’ \0 '。

1.1 一维数组

下面是对 sizeof 和 strlen 的实操,可能有点不好理解,集中注意力哦 !

4 / 8 取决于平台的环境,x64环境下就是 8 ,x86环境下就是 4 。

#include<stdio.h>
int main()
{
	char* x = "abcdefgh";
	printf("%d\n", sizeof(x));        //     4/8  ---  p的类型是字符指针,只要是地址就是4/8
	printf("%d\n", sizeof(x + 1));    //     4/8  ---  指向b的地址,同样是4/8
	printf("%d\n", sizeof(*x));       //     1    ---  x是首元素地址,解引用之后就是a,最后大小就是1字节
	printf("%d\n", sizeof(x[0]));     //     1    ---  首元素 a 
	//前面说过x[0] == *(x+0)
	printf("%d\n", sizeof(&x));       //     4/8  ---  &x 表示地址
	printf("%d\n", sizeof(&x + 1));   //     4/8  ---  &x + 1 跳过x变量的地址
	printf("%d\n", sizeof(&x[0] + 1));//     4/8  ---  b的地址


	char* y = "abcdefgh";  //字符串末端有'\0'
	printf("%d\n", strlen(y));        //     8       ---  首元素开始向后查找
	printf("%d\n", strlen(y + 1));    //     7       ---  从b开始向后查找
	printf("%d\n", strlen(*y));       //     error   ---  strlen后传的是地址,这里解引用之后就不是地址了,引发错误
	printf("%d\n", strlen(y[0]));     //     error   ---  y[0]==*(y+0),同上
	printf("%d\n", strlen(&y));       //     随机值   ---  &y是给定了y的地址,无法得知具体存放的数值,也就找不到'\0'
	printf("%d\n", strlen(&y + 1));   //     随机值   ---  同上
	printf("%d\n", strlen(&y[0] + 1));//     7       ---  从b开始向后查找
	return 0;
}

1.2 二维数组

#include<stdio.h>
int main()
{
	int x[3][4] = { 0 };
	printf("%d\n", sizeof(x));           // 48    ---   整个二维数组的大小
	printf("%d\n", sizeof(x[0][0]));     // 4     ---   首元素的大小
	printf("%d\n", sizeof(x[0]));        // 16    ---   第一行
	printf("%d\n", sizeof(x[0] + 1));    // 4/8   ---   第一行第二个元素的地址
	printf("%d\n", sizeof(*(x[0] + 1))); // 4     ---   第一行第二个元素
	printf("%d\n", sizeof(x + 1));       // 4/8   ---   (x+1) == &x[1] 就是第二行的地址
	printf("%d\n", sizeof(*(x + 1)));    // 16    ---   有解引用操作符,表示计算第二行的大小
	printf("%d\n", sizeof(&x[0] + 1));   // 4/8   ---   第二行的地址
	printf("%d\n", sizeof(*(&x[0] + 1)));// 16    ---   计算第二行大小
	printf("%d\n", sizeof(*x));          // 16    ---   *x == *(x+0)== x[0]
	printf("%d\n", sizeof(x[3]));        // 16    ---   sizeof不会真实计算表达式的值
	//x[3]==x[0]或者其他,不在乎[]内的值
	return 0;
}

看到这里指针三部曲就接近尾声了,指针是比较重要的一部分,要仔细钻研哦~

💖指针三部曲传送门

  1. 指针(一)
  2. 指针(二)
  3. 指针(三)
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值