一、基础知识
1.指针在32位平台和64位平台的大小是不同的,32位下是4字节,64位下是8字节
2.*a == *(a+0) == a[0]这个🦁式子要牢记~
3.只要是地址,那么大小就是4或者8
strlen
1.是一种函数。
2.’\0’作为终止符;
3.strlen的结果运行的时候才出来(不是编译期求值),是计算字符串长度的。
4.其参数必须是字符型指针(char*)。就是传进来的必须是char*的地址
5.需要引用头文件为#include<string.h>
sizeof
1.是一种c中的基本运算符。
2.可以以类型、指针、数组和函数等作为参数。
3.返回值类型为unsigned int
4.运算值在编译的时候就出结果,所以可以用来定义数组维数。
5.sizeof()是一种单目操作符,是用来计算你所使用的操作数所占的空间字节大小。
二、练习
int a[] = {1,2,3,4}; printf("%d\n",sizeof(a)); //答案:4*4=16 //数组名a单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小, printf("%d\n",sizeof(*&a)); //答案:16 //因为&a取出的是整个数组的地址,对整个数组的地址解引用,得到的就是数组的大小//本质上和第一个一样哦↑👆 printf("%d\n",sizeof(a+0)); //答案:4或者8 //此时a就表示首元素的地址了,因为a不是单独放在sizeof内部了 printf("%d\n",sizeof(*a)); //答案:4 //此时a为首元素地址,*a就是得到第一个数组元素,相当于a[0],一个整型的大小就是4 printf("%d\n",sizeof(a+1)); //答案:4或者8 //因为此时a为首元素地址,a+1代表第二个元素的地址 printf("%d\n",sizeof(a[1])); //答案:4 //因为a[1]代表的是第二个元素 printf("%d\n",sizeof(&a)); //答案:4或者8 //因为&a取出的是整个数组的地址,而只要是地址,那么大小就是4或者8 printf("%d\n",sizeof(&a+1)); //答案:4或者8 //&a+1得到的是a这个数组之后的,跳过整个数组a的地址,但本质仍然是地址 printf("%d\n",sizeof(&a[0])); //答案:4或者8 //因为得到的是a[0]这个元素的地址 printf("%d\n",sizeof(&a[0]+1)); //答案:4或者8 //得到的是第二个元素的地址
char arr[] = {'a','b','c','d','e','f'}; printf("%d\n", sizeof(arr)); //答案:6 //sizeof里面单独放数组名,得到的是整个数组的大小,六个元素,每个元素是1个字节 printf("%d\n", sizeof(arr+0)); //答案:4或者8 //得到的是第一个元素的地址 printf("%d\n", sizeof(*arr)); //答案:1 //访问了‘a’,而a是一个字节 printf("%d\n", sizeof(arr[1])); //答案:1 //访问了‘a’,而a是一个字节 printf("%d\n", sizeof(&arr)); //答案:4或者8 //取出整个数组的地址 printf("%d\n", sizeof(&arr+1)); //答案:4或者8 //跳过整个数组,但仍然是地址 printf("%d\n", sizeof(&arr[0]+1)); //答案:4或者8 //得到了第二个元素的地址 printf("%d\n", strlen(arr)); //答案:未知数 //因为结尾没有'\0' printf("%d\n", strlen(arr+0)); //答案:未知数 //因为结尾没有'\0' printf("%d\n", strlen(*arr)); //答案:非法访问内存,编译会出错 //因为strlen以为传进来的‘a’的ascll码值是一个地址 printf("%d\n", strlen(arr[1])); //答案:非法访问内存,编译会出错 //因为strlen以为传进来的‘b’的ascll码值是一个地址 printf("%d\n", strlen(&arr)); //答案:未知数 //&arr得到的是数组的地址,由于结尾没有'\0',仍然为随机值 printf("%d\n", strlen(&arr+1)); //答案:随机值 //由于结尾没有'\0' printf("%d\n", strlen(&arr[0]+1)); //答案:随机值 //由于结尾没有'\0'