指针和数组在strlen和sizeof中的效果
文章目录
一、strlen - 库函数
返回类型是size_t
形参类型 const char* string
1. 求字符串长度
char arr[] = "abcdef";
int sz = strlen(arr);
2. 关于指针、数组名
//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//随机值
//随机值,没有'\0'
printf("%d\n", strlen(arr+0));//随机值
//首元素地址往后打印,没有'\0'
printf("%d\n", strlen(*arr));//错误
//strlen以为传进来'a'= a的ascii码值 97 这个位置的地址
//实际上是个野指针
printf("%d\n", strlen(arr[1]));//同上
printf("%d\n", strlen(&arr));//随机值
//把首元素地址传进去
printf("%d\n", strlen(&arr+1));//随机值
//从跳过这个数组开始数
printf("%d\n", strlen(&arr[0]+1));//随机值
//从第二个元素开始数
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//6
//计算数组元素个数
printf("%d\n", strlen(arr+0));//6
//首元素地址
printf("%d\n", strlen(*arr));//错误
//拿到元素a - 97 野指针
printf("%d\n", strlen(arr[1]));//错误
//同上
printf("%d\n", strlen(&arr));//6
//整个数组的地址,类型不匹配,但还是拿到a的地址
printf("%d\n", strlen(&arr+1));//随机值
//跳过整个数组的地址传进去
printf("%d\n", strlen(&arr[0]+1));//5
//第二个元素地址
//指针
char *p = "abcdef";
printf("%d\n", strlen(p));//6
//a的地址传进去
printf("%d\n", strlen(p+1));//5
//b的地址传进去
printf("%d\n", strlen(*p));//错误
//a - 97
printf("%d\n", strlen(p[0]));//错误
//同上
printf("%d\n", strlen(&p));// 随机值
//不知道指针变量的地址,后面不知道什么时候到'\0'
printf("%d\n", strlen(&p+1));//随机值
//同上
printf("%d\n", strlen(&p[0]+1));//5
//第二个元素的地址
二、sizeof - 操作符 单位字节
求变量所占空间大小
1. 求一个整型数组有几个元素
int a[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
//整个数组所占空间大小/每个元素所占空间大小=整型数组的元素个数
2. 关于指针、数组名
//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));// 16
//数组名单独放在sizeof中,a表示整个数组的地址,计算整个数组的大小
printf("%d\n",sizeof(a+0));// 4/8
//不是第一种情况,a是首元素地址,计算首元素地址大小4/8
printf("%d\n",sizeof(*a));// 4
//这里a首元素地址,*a是首元素,元素是整型
printf("%d\n",sizeof(a+1));// 4/8
//第二个元素的地址大小
printf("%d\n",sizeof(a[1]));// 4
//第二个元素所占内存大小
printf("%d\n",sizeof(&a));// 4/8
//&a取出的是整个数组的地址,地址所占大小就是 4/8
printf("%d\n",sizeof(*&a));// 16
//取出整个数组,计算整个数组的大小
printf("%d\n",sizeof(&a+1));// 4/8
//数组地址+1,跳到数组最后,还是地址
printf("%d\n",sizeof(&a[0]));// 4/8
//第一个元素地址
printf("%d\n",sizeof(&a[0]+1));// 4/8
//第二个元素地址
//字符数组
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
//第二个元素地址
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7
//数组名单独放在sizeof内部表示整个数组
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
//第二个元素的地址
//指针
char *p = "abcdef";
printf("%d\n", sizeof(p));// 4/8
//指针大小
printf("%d\n", sizeof(p+1));// 4/8
//第二个元素地址
printf("%d\n", sizeof(*p));//1
//第一个元素
printf("%d\n", sizeof(p[0]));//1
//首元素
printf("%d\n", sizeof(&p));//4/8
//指针的地址
printf("%d\n", sizeof(&p+1));//4/8
//指针的地址+1
printf("%d\n", sizeof(&p[0]+1));//4/8
//第二个元素地址
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));//48
//整个数组
printf("%d\n",sizeof(a[0][0]));//4
//首元素
printf("%d\n",sizeof(a[0]));//16
//第一行数组名,表示第一行数组
printf("%d\n",sizeof(a[0]+1));//4/8
//a[0]第一行首元素地址,所以是第一行第二个元素地址
printf("%d\n",sizeof(*(a[0]+1)));//4
//第一行第二个元素
printf("%d\n",sizeof(a+1));//4/8
//二维数组的数组名,代表第一行数组的地址,a+1为第二行地址
printf("%d\n",sizeof(*(a+1)));//16
//第二行地址a[1],相当于第二行数组的数组名
printf("%d\n",sizeof(&a[0]+1));// 4/8
//第二行数组地址
printf("%d\n",sizeof(*(&a[0]+1)));//16
//第二行数组数组名
printf("%d\n",sizeof(*a));//4
//第一行首元素
printf("%d\n",sizeof(a[3]));//16
//第四行数组名,因为sizeof内部不参与运算,不会访问该空间
//只是去看了一下第四行的类型