解题思路
1.对于sizeof( )
1.数组名单独放在sizeof()内部,数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节。
2.&数组名,数组名表示整个数组,&数组名,取出的是整个数组的地址。
3.除此之外所有的数组名都表示整个首元素地址。
2.对于strlen(),它寻找的是‘\0’,有‘\0’终止,没有继续数。
int a[] = { 1, 2, 3, 4 };
1.printf("%d\n", sizeof(a)); // 16
2.printf("%d\n", sizeof(a+0)); // 4 不是单独放在sizeof()内是第一个元素的地址
3.printf("%d\n", sizeof(*a)); //4 *a就是啊a【0】
4.printf("%d\n", sizeof(a+1));//4 第二个元素的地址
5.printf("%d\n", sizeof(a[1])); //4 第二个元素
6.printf("%d\n", sizeof(&a)); // 4 地址都是4个字节(32平台)
7.printf("%d\n", sizeof(&a+1)); //4 4后面的地址
8.printf("%d\n", sizeof(&a【0】));/4 第一个元素的地址
9.printf("%d\n", sizeof(&a【0】+1));//4 第二个元素的地址
char a[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};
1.printf("%d\n", sizeof(a));
//6
2.printf("%d\n", sizeof(a+0));
//4 地址
3.printf("%d\n", sizeof(*a));
//1 字符a
4.printf("%d\n", sizeof(a【1】));
//1
5.printf("%d\n", sizeof(&a));
//4
6.printf("%d\n", sizeof(&a+1));
//4
7.printf("%d\n", sizeof(&a【0】+1));
//4 f的后面地址
8.printf("%d\n", sizeof(&a+1));
//4 第二个元素的地址
1.printf("%d\n", strlen(a));
//随机值 因为没有\0
2 printf("%d\n", strlen(a+0));
//随机值 并且和上一个一样
3.printf("%d\n", strlen(*a));
//错误
4.printf("%d\n", strlen(a【1】));
//错误
5.printf("%d\n", strlen(&a));
//随机值
6.printf("%d\n", strlen(&a+1));
//随机值 和1的随机值差6
7.printf("%d\n", strlen(&a【0】+1));
//随机值 和1的随机值差1
char arr[] = “abcdef”;
1.printf("%d\n",sizeof(arr)); //7 计算大小有'\0'
2.printf("%d\n",sizeof(arr+0)); // 4 地址是4字节
3.printf("%d\n",sizeof(*arr)); // 1 首元素的大小
4.printf("%d\n",sizeof(arr【1】));//1 首元素的大小
5.printf("%d\n",sizeof(&arr)); //4 取地址32位平台是4字节,64位平台是8字节
6.printf("%d\n",sizeof(&arr+1)); //4 取地址32位平台是4字节,64位平台是8字节
1.printf("%d\n",strlen(arr)); //6
2.printf("%d\n",strlen(arr+0));//6
3.printf("%d\n",strlen(*arr)); //错误 传的是一个值,所以错误。
4.printf("%d\n",strlen(arr【1】));//错误 传的是一个值
5.printf("%d\n",strlen(&arr)); //6 &arr就是从头数,数到‘\0’’停止
6.printf("%d\n",strlen(&arr+1));// 随机值,因为将整个arr跳过
7.printf("%d\n",strlen(&arr【0】+1));//5 从第二个元素向后数
char *p = “abcdef”;
1.printf("%d\n",sizeof(p)); //4 指针变量都是4个字节
2.printf("%d\n",sizeof(p+1));//4 p+1是b的地址
3.printf("%d\n",sizeof(*p));//1 a的大小
4.printf("%d\n",sizeof(p【0】));// 同上
5.printf("%d\n",sizeof(&p));//4
6.printf("%d\n",sizeof(&p+1));//4 p是个指针变量,指向是a的地址,p是变量有自己的地址,char **pp =&p;pp是个二级指针,指向的是p的地址,指向的是char *类型的变量,加一跳过的是一个char *的大小
7.printf("%d\n",sizeof(&p【0】+1));//4
1.printf("%d\n",strlen(p)); //6
2.printf("%d\n",strlen(p+1));//5
3.printf("%d\n",strlen(*p));//错误 因为传的是个值
4.printf("%d\n",strlen(p【0】));//同上
5.printf("%d\n",strlen(&p));//随机值
6.printf("%d\n",strlen(&p+1));//随机值
7.printf("%d\n",strlen(&p【0】+1));//5 从第二个元素后面数
int a [3] [4] = {0};
1.printf("%d\n",sizeof(a)); //48
2.printf("%d\n",sizeof(a[0][0]));//4
3.printf("%d\n",sizeof(a[0]));//16 第一行的大小
4.printf("%d\n",sizeof(a[0]+1));//4 第一行第二个元素的地址
5.printf("%d\n",sizeof(a+1)); //4 第二行的地址
6.printf("%d\n",sizeof(&a[0]+1));//4 第二行的地址
7.printf("%d\n",sizeof(*a));//16 不是单独放,a表示第一行的地址
8.printf("%d\n",sizeof(a[3])); //16 sizeof()内部的表达式是不参与运算的,所以结果是16,虽然第4行不存在但是不访问
sizeof关键字是在编译时,括号里的表达式是在运行时的,所以不执行sizeof的表达式。