//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
分析如下:
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16 sizeof(数组名)单独用在一起时,求整个数组的大小 4*4
printf("%d\n", sizeof(a + 0));//4/8 只有是sizeof(数组名),数组名单独做表达式时求整个数组的大小,其他表示首元素的地址
printf("%d\n", sizeof(*a));//4 这里的a表示首元素的地址,对其解引用时,求出整型的大小
printf("%d\n", sizeof(a + 1));//4/8 这里的a也表示首元素的地址,a+1表示第二个元素的地址,地址大小4/8
printf("%d\n", sizeof(a[1]));//4 这里求整型的大小
printf("%d\n", sizeof(&a));//4/8 虽然&a取出来的是整个数组的地址,但是依然是地址,地址的大小就是4/8
printf("%d\n", sizeof(*&a));//16 *和&相当于互逆的操作,此时的表达是就相当于sizeof(a)
printf("%d\n", sizeof(&a + 1));//4/8 虽然该地址指向的空间未知,但依然是地址
printf("%d\n", sizeof(&a[0]));//4/8 首元素的地址
printf("%d\n", sizeof(&a[0] + 1));//4/8 第二个元素的地址
//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
分析如下:
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6 arr表示整个数组,此时求的是整个数组的大小 6*1
printf("%d\n", sizeof(arr + 0));//4/8 这里的arr并不是单独作为表达式放在sizeof里面,所以这里表示首元素的地址
printf("%d\n", sizeof(*arr));//1 字符类型的大小
printf("%d\n", sizeof(arr[1]));//1 字符类型的大小
printf("%d\n", sizeof(&arr));//4/8 这里的&arr虽然取出来就的是整个数组的地址,但依然是地址
printf("%d\n", sizeof(&arr + 1));//4/8 这里虽然指向的地址未知,但是依然是个地址
printf("%d\n", sizeof(&arr[0] + 1));//4/8 第二个元素的地址
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
分析如下:
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));//随机值,这里的arr并没有单独放在sizeof里面,所以这里的arr表示首元素地址,strlen 会从首地址开始找知道找到\0
printf("%d\n", strlen(arr + 0));//随机值 这里的arr表示首元素地址,
//printf("%d\n", strlen(*arr));//err 这里*arr表示a,a的ascall值是65,会被strlen当成地址访问,属于非法访问了
//printf("%d\n", strlen(arr[1]));//err arr[1]相当于*(arr+1)
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr + 1));//随机值
printf("%d\n", strlen(&arr[0] + 1));//随机
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
分析如下:
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 arr单独作为表达式放在sizeof里面,求的是整个数组的大小 7*1
printf("%d\n", sizeof(arr + 0));//4/8 此时的arr并不是单独作为表达式放在sizeof里面,所以这里的arr表示首元素的地址,地址的大小
printf("%d\n", sizeof(*arr));//1 这里的arr表示首元素地址,*arr就是a,这里求字符的大小
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8 &arr虽然取出来的是整个数组的地址,但依然是地址
printf("%d\n", sizeof(&arr + 1));//4/8 &arr+1是跨过了整个数组的地址,但依然是地址
printf("%d\n", sizeof(&arr[0] + 1));//4/8 第二个元素的地址
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
分析如下:
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//6 这里是strlen(计算字符串的大小) ,arr没有单独放在sizeof里面,arr是首元素地址从首元素向后找直到找到\0
printf("%d\n", strlen(arr + 0));//6 这里给strlen传过去的依然是arr ,这里的arr是首元素地址
//printf("%d\n", strlen(*arr));//err 因为strlen要给它传过去地址,*arr是a,a的ascall是65,所以strlen会把65当做起始地址,往后寻找,这里非法访问了
//printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//6 &arr取出整个数组的地址,从整个数组的地址往后找,直到找到\0
printf("%d\n", strlen(&arr + 1));//随机值
printf("%d\n", strlen(&arr[0] + 1));//5 &arr[0]+1是第二个元素的地址,所以strlen从第二个元素开始找,直到找到\0
//字符指针
char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
分析如下:
char* p = "abcdef";//将首元素的地址给了p
printf("%d\n", sizeof(p));//4/8 p是字符指针,sizeof(p)是计算字符指针变量的大小 4/8
printf("%d\n", sizeof(p + 1));//4/8 p表示首元素地址,p+1表示第二个元素的地址
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1 p[0]相当于*(P+0),
printf("%d\n", sizeof(&p));//4/8 &p找到p的地址---二级指针
printf("%d\n", sizeof(&p + 1));//4/8
printf("%d\n", sizeof(&p[0] + 1));//4/8 第二个元素的地址
//字符指针
char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));
分析如下:
char* p = "abcdef";
printf("%d\n", strlen(p));//6 p是首元素的地址,strlen从首元素开始往后找,知道找到\0
printf("%d\n", strlen(p + 1));//5 p+1表示第二个元素的地址
//printf("%d\n", strlen(*p));//err strlen要给它传过去地址,*p是a,a的ascall是65,所以strlen将65作为地址进行访问,属于非法访问
//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));//5 从第二个元素的地址开始访问知道找到\0
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
分析如下:
二维数组
int a[3][4] = { 0 };//可以看成一维数组:有三个元素a[0],a[1],a[2],每个元素的内容又是一个一维数组
printf("%d\n", sizeof(a));//48 a单独放在了sizeof()里面计算的是整个数组的大小 12*4
printf("%d\n", sizeof(a[0][0]));//4 计算首元素的大小--整型的大小
printf("%d\n", sizeof(a[0]));//16 a[0]是第一行的地址,a[0]可以看成第一行一维数组的数组名,一维数组的数组名单独放在sizeof()里面求的是一维数组的大小 4*4
printf("%d\n", sizeof(a[0] + 1));//4/8 a[0]并不是单独放在了sizeof里面,所以a[0]代表第一行一维数组的首元素a[0][0]的地址,a[0]+1就是a[0][1]的地址
printf("%d\n", sizeof(*(a[0] + 1)));//4 a[0][1]的大小
printf("%d\n", sizeof(a + 1));//4/8 a不是单独放在sizeof()里面,a表示首元素的地址,二维数组一谈到首元素就是第一行一维数组的地址首元素是a[0],所以a+1表示a[1]的地址
printf("%d\n", sizeof(*(a + 1)));//16 第一行的大小 4*4
printf("%d\n", sizeof(&a[0] + 1));//4/8 这里是第二行的地址
printf("%d\n", sizeof(*(&a[0] + 1)));//16 计算第二行的大小 4*4
printf("%d\n", sizeof(*a));//16 a并不是单独放在sizeof里面,所以a表示首元素地址,二维数组一谈到首元素就是把二维数组看成一维数组后,第一行的地址 这里计算第一行的大小 4*4
printf("%d\n", sizeof(a[3]));//16 sizeof里面的表达式并不参与计算,sizeof只是根据表达式中的类型