来到了指针的最后一曲,准备好了吗?
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;
}
看到这里指针三部曲就接近尾声了,指针是比较重要的一部分,要仔细钻研哦~