指针的运算-数组名的理解-指针类型的意义
strlen 用来求字符串的长度,关注的是字符串中的\0,计算的是\0之前出现字符的个数
strlen是库函数,只针对字符串
sizeof 只关注占用内存空间的大小,不再回内存中存放的是什么
sizeof是操作符
数组
int main()
{
int a[] = {1,2,3,4};
printf("%d\n", sizeof(a));//16
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小
printf("%d\n", sizeof(a+0));//4
//a不是单独放在sizeof内部,也没有取地址,所以a+0就是首元素的地址,单位是字节
//是地址,大小就是4/8个字节
printf("%d\n", sizeof(*a));//4
//*a中的a就是数组首元素的地址,*a就是对首元素得地址进行解引用,找到的就是首元素
//首元素的大小就是4个字节
printf("%d\n", sizeof(a+1));//4
//a+1就是第二个元素的地址,是地址就是4/8字节
printf("%d\n", sizeof(a[1]));//4
//计算的是第二个元素所占空间的大小
printf("%d\n", sizeof(&a));//4
//&a取出的数组的地址,数组的地址,也就是个地址4/8字节
printf("%d\n", sizeof(*&a));//16
//&a----->int (*) *是对&a的解引用,也就是a的值
//&a拿到的是数组名的地址,类型是int(*)[4],是一种数组指针
//数组指针解引用找到的是数组
//&a----->a
printf("%d\n", sizeof(&a+1));//4
//跳过整个数组a的第一个地址
//&a--> int(*)[4]
//&a+1是从数组a的地址向后跳过了一个(4个类型元素的)数组大小
//&a+1还是地址,是地址就是4/8个字节
printf("%d\n", sizeof(&a[0]));//4
//就是第一个元素地址,计算的是地址的大小
printf("%d\n", sizeof(&a[0]+1));//4
//一个元素的地址加1 &a[0]+1---->&a[1]
return 0;
}
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6
//sizeof(数组名)就是元素的个数
printf("%d\n", sizeof(arr+0));//4
//arr+0就是数组首元素的地址
printf("%d\n", sizeof(*arr));//1
//*arr是对首元素的地址解引用就是第一个元素
//*arr-->arr[0]
//*(arr+0)-->arr[0]
printf("%d\n", sizeof(arr[1]));//1
//数组的第二个元素
printf("%d\n", sizeof(&arr));//4
//数组的地址,是地址就是4/8字节
printf("%d\n", sizeof(&arr+1));//4
//&arr+1是数组后的地址
printf("%d\n", sizeof(&arr[0] + 1));
//&arr[0]+1是第二个元素的地址
printf("%d\n", sizeof(arr[0]+1));//4
//arr[0]是第一个元素字节为1但是+1之后1是int格式
//这就会发生整型提升也就是四个字节
printf("%d\n", sizeof(arr));
return 0;
}
int main()
{
char arr[] = { 'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//随机值
printf("%d\n", strlen(arr + 0));//随机值,首元素的地址+0还是首元素的地址
/*
printf("%d\n", strlen(*arr));//*arr--->strlen('a')---->strlen(97)--->野指针
printf("%d\n", strlen(arr[1]));//*arr--->strlen('b')---->strlen(98)--->野指针
*/
printf("%d\n", strlen(&arr));//整个数组的第一个地址,随机值
printf("%d\n", strlen(&arr+1));//整个数组的第一个地址+1,随机值-6
//从整个数组的第一个地址+1开始数知道找到'\0'才算停止,也就是随机值-6
printf("%d\n", strlen(&arr[0]+1));//随机值-1
return 0;
}
int main()
{
char arr[] = "abcdef";
//[a b c d e f \0]
//sizeof 计算的是变量或者数据占内存空间的大小
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr+0));//首元素的地址 4
printf("%d\n", sizeof(*arr));//对首元素的地址解引用也就是a 1个字节
printf("%d\n", sizeof(arr[1]));//数组的第二个元素 1个字节
printf("%d\n", sizeof(&arr));//整个数组的第一个地址 4字节
printf("%d\n", sizeof(&arr+1));//整个数组的地址+1 4字节
printf("%d\n", sizeof(&arr[0]+1));//数组的第二个元素b的地址 4个字节
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//从首元素的地址开始向后找\0 6
/*
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
*/
printf("%d\n", strlen(&arr));//整个数组的首元素的地址向后找\0 6
printf("%d\n", strlen(&arr + 1));//整个数组后的第一个地址向后找\0 随机数
printf("%d\n", strlen(&arr[0] + 1));//数组的第二个地址向后找\0 5
return 0;
}
*p
int main()
{
char* p = "abcdef";
printf("%d\n", sizeof(p));//首元素的地址 4
printf("%d\n", sizeof(p+1));//首元素的地址+1 4
printf("%d\n", sizeof(*p));//首元素 1个字节
printf("%d\n", sizeof(p[0]));//首元素
printf("%d\n", sizeof(&p));// 二级指针的第一个地址 4
printf("%d\n", sizeof(&p+1));//整个地址后一个地址4
printf("%d\n", sizeof(&p[0]+1));//第一个元素地址后的第一个地址
printf("==============================\n");
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p + 1));//首地址之后找\0 5
/*
printf("%d\n", strlen(*p));//err
printf("%d\n", strlen(p[0]));//err
*/
printf("%d\n", strlen(&p));//&p的内存与p的内存不同 随机值
printf("%d\n", strlen(&p + 1));//同上 随机值
printf("%d\n", strlen(&p[0] + 1));//第一个元素之后找\0 5
return 0;
}