在这里笔者要重点强调的是strlen()函数的工作过程。
strlen(const char *) 后面只要是char *类型地址,从这个地址开始往后找‘\0’ ,直到找到'\0'结束。
sizeof()是计算所求变量所占的内存空间,在vs编译器win32平台下指针统一占4个字节。
#include<stdio.h>
#include<stdlib.h>
#include<string>
int main()
{
char arr[] = { 1,2,3,4,5,6 };
printf("%d", strlen(&arr + 1));//char *(p)[6]
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr + 0));//4 地址值
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr + 1));//4
printf("%d\n", sizeof(&arr[0] + 1));//指针+1
printf("%d\n", strlen(arr));//随便
printf("%d\n", strlen(arr + 0));//随便
printf("%d\n", strlen(*arr));//char arr[0]
printf("%d\n", strlen(arr[1]));//char
printf("%d\n", strlen(&arr));//char (*)[6]
printf("%d\n", strlen(&arr + 1));//char (*)[6]
printf("%d\n", strlen(&arr[0] + 1));//char *
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr + 0));//4
printf("%d\n", sizeof(*arr));//4
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr + 1));//4
printf("%d\n", sizeof(&arr[0] + 1));//4
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//6
printf("%d\n", strlen(*arr));// strlen必须是char *类型
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));//char (*)[7]
printf("%d\n", strlen(&arr + 1));
printf("%d\n", strlen(&arr[0] + 1));//5在arr[0]的地址上加一个char
const char *p = "abcdef";
printf("%d\n", sizeof(p));//4
printf("%d\n", sizeof(p + 1));//4
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//*(p+0)1 a
printf("%d\n", sizeof(&p));//4 **
printf("%d\n", sizeof(&p + 1));//4
printf("%d\n", sizeof(&p[0] + 1));//4
printf("%d\n", strlen(p));//6 后面只要是char *类型地址,从这个地址开始往后找‘\0’
printf("%d\n", strlen(p + 1));//5
printf("%d\n", strlen(*p));//char *
printf("%d\n", strlen(p[0]));//char
printf("%d\n", strlen(&p));//char **
printf("%d\n", strlen(&p + 1));//char **
printf("%d\n", strlen(&p[0] + 1));//5 &p[0]=p
system("pause");
return 0;
}
对字符数组变量名的含义和用法不熟悉的朋友可以参见我的另几篇博客。
一维数组数组名含义解析,数组指针的使用 https://blog.csdn.net/weixin_43447989/article/details/90346271
一维数组传参、二维数组传参、一级指针传参、二级指针传参 https://blog.csdn.net/weixin_43447989/article/details/90347625
(*( void (*) ( ) ) 0 ) ()的含义,二维数组数组名的含义和用法 *(*(a+i)+j)的含义,*(a+1)+3的含义,*(a+1+1)的含义https://blog.csdn.net/weixin_43447989/article/details/90380906