一.sizeof()的有关运算
1.知识:
- 当数组名a单独放在sizeof()内部(即 sizeof(a))时,a表示整个数组;当数组名a单独放在&后面时(即&a),a表示整个数组;
- 其余的a都表示数组a首元素的地址;&a,表示数组a的地址,其实是a首元素的地址,一个整形大小为4个字节,一个字符型大小为1个字节
2.相关计算
include<stdio.h>
int main()
{
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //整个数组的大小 16
printf("%d\n",sizeof(a+0)); //首元素的地址加0,还是首元素的地址 4
printf("%d\n",sizeof(*a)); //数组a首元素的大小 4
printf("%d\n",sizeof(a+1)); //数组a首元素的地址加1,表示数组第二个元素的地址的大小,地址为4个字节 4
printf("%d\n",sizeof(a[1])); //数组a第二个元素的大小 4
printf("%d\n",sizeof(&a)); //数组a首元素地址的大小 4
printf("%d\n",sizeof(&a+1)); //数组a下一个数组(其他)的地址大小 4
printf("%d\n",sizeof(&a[0])); //数组a首元素地址的大小 4
printf("%d\n",sizeof(&a[0]+1)); //数组a第二个元素的地址的大小 4
return 0;
}
//字符数组
#include<stdio.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'}; //arr[]表示一个字符数组,里面有6个元素,不包括\0,一个char类型大小为1个字节
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])); //数组第二个元素'b' 的大小 1
printf("%d\n", sizeof(&arr)); //数组首元素的地址 4
printf("%d\n", sizeof(&arr+1)); //跳过整个数组,后面内容的地址的大小 4
printf("%d\n", sizeof(&arr[0]+1)); //数组第二个元素的地址的大小 4
return 0;
}
二.strlen()的有关运算
1.strlen()用来计算指定字符串的长度,不包括结束字符“\0”;它会从首地址一直找下去,直到遇到"\0"停止。
2.相关计算:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
//从数组的首元素地址一直找下去,直到"\0"停止,该数组不包括"\0",所以它会一直找下去,计算结果为一随机数
printf("%d\n", strlen(arr+0));
//从数组的首元素地址一直找下去,计算结果为一随机数
printf("%d\n", strlen(*arr));
//*arr表示首元素,即'a',也就是从地址值为97开始找,但97是一个未知地址,不允许访问,所以这题是错误的
printf("%d\n", strlen(arr[1]));
//arr[1],即'b',所以这题也是错误的
printf("%d\n", strlen(&arr));
//从数组的首地址一直找下去,计算结果为一随机数
printf("%d\n", strlen(&arr+1));
//从跳过这个数组的地址开始找下去,计算结果为一随机数,比上式大6
printf("%d\n", strlen(&arr[0]+1));
//从数组的第二个元素的地址一直找下去,计算结果为一随机数,比上式小5
return 0;
}
2.
#include<stdio.h>
#include<string.h>
int main()
{
char *p = "abcdef";//*p 表示字符类型的指针变量p
printf("%d\n", sizeof(p));//p存放首元素a的地址,则结果为4
printf("%d\n", sizeof(p+1));//p+1存放b的地址,结果为4
printf("%d\n", sizeof(*p));//*p表示首元素,结果为1
printf("%d\n", sizeof(p[0]));//表示首元素,结果为1
printf("%d\n", sizeof(&p));//字符类型的指针变量p的地址大小,结果为4
printf("%d\n", sizeof(&p+1));//指向下一个地址,仍然是地址,结果为4
printf("%d\n", sizeof(&p[0]+1));//b的地址,结果为4
printf("%d\n", strlen(p));//从a的地址一直找,直到遇到"\0"结束,结果为6
printf("%d\n", strlen(p+1));//从b的地址一直找,直到遇到"\0"结束,结果为6
printf("%d\n", strlen(*p));//错误,*p表示首元素,即'a',也就是从地址值为97开始找,但97是一个未知地址,不允许访问,所以这题是错误的
printf("%d\n", strlen(p[0]));//错误,与上式一样
return 0;
}