sizeof: 求所分配的字节数,单位是字节;
strlen: 获取字符的个数;
几个重要的知识点:
- 数组名单独放在sizeof内部,数组名表示整个数组的大小;
- &+数组名,数组名表示整个数组;&数组名,取出的是整个数组的地址;
- 除此之外,所有的数组名都是首元素的地址;
- 一些典型的例子:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int a[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(a)); //16 printf("%d\n", sizeof(a+0)); //4 printf("%d\n", sizeof(*a)); //4 printf("%d\n", sizeof(a+1)); //4 printf("%d\n", sizeof(a[1])); //4 printf("%d\n", sizeof(&a)); //4 printf("%d\n", sizeof(*&a)); //16 printf("%d\n", sizeof(&a+1)); //4 printf("%d\n", sizeof(&a[0])); //4 printf("%d\n", sizeof(&a[0]+1)); //4 system("pause"); return 0;}
- sizeof(a) 数组名单独放在sizeof内部,表示整个数组的大小。 整个数组4个元素,一个元素4个字节,共16个字节。
- sizeof(a+0) 数组名没有单独放在sizeof内部,数组名前也没有&,所以a表示首元素的地址;a+0依旧表示首元素的地址,地址为4个字节。
- sizeof(*a) 数组名没有单独放在sizeof内部,数组名前也没有&,所以a表示首元素的地址;*a表示首元素,int(整形)元素占4个字节。
- sizeof(a+1) 数组名没有单独放在sizeof内部,数组名前也没有&,所以a表示首元素的地址;a+1表示第二个元素的地址。地址占4个字节。
- sizeof(a[1]) a[1]表示第二个元素,int(整形)元素占4个字节。
- sizeof(&a) 数组名没有单独放在sizeof内部,但是数组名前有&,所以&a表示整个数组的地址。地址占4个字节。
- sizeof(*&a) 数组名没有单独放在sizeof内部,但是数组名前有&,所以&a表示整个数组的地址;*(&a)表示整个数组的元素。整个数组4个元素,一个元素4个字节,共16个字节。
- sizeof(&a+1) 数组名没有单独放在sizeof内部,但是数组名前有&,所以&a表示整个数组的地址;&a+1表示跳过整个数组的下一个元素地址。地址占4个字节
- sizeof(&a[0]) a[0]表示首元素,&a[0]表示首元素的地址。地址占4个字节
- sizeof(&a[0]+1)a[0]表示首元素,&a[0]表示首元素的地址,&a[0]+1,表示第二个元素的地址。地址占4个字节
#include<stdio.h> #include<stdlib.h> int main() { char arr[] = { 'a','b', 'c', 'd', 'e', 'f' }; 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])); //1 printf("%d\n", sizeof(&arr)); //4 printf("%d\n", sizeof(&arr + 1)); //4 printf("%d\n", sizeof(&arr[0] + 1)); //4 system("pause"); return 0; }
- sizeof(arr) 数组名单独放在sizeof内部,表示整个数组的大小;整个数组有6个元素,每个元素1个字节,共6个字节。
- sizeof(arr+0) 数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;arr+0也表示首元素的地址,地址占4个字节。
- sizeof(*arr) 数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;*arr表示首元素,字符型元素占1个字节。
- sizeof(arr[1]) arr[1]表示第二个元素,字符型元素占1个字节。
- sizeof(&arr) 数组名没有单独放在sizeof内部,但数组名前有&,所以&arr表示整个数组的地址;地址占4个字节。
- sizeof(&arr+1) 数组名没有单独放在sizeof内部,但数组名前有&,所以&arr表示整个数组的地址;&arr+1表示跳过整个数组,下一个元素的地址;地址占4个字节。
- sizeof(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址;地址占4个字节。
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char arr[] = { 'a','b', 'c', 'd', 'e', 'f' }; printf("%d\n", strlen(arr)); //随机值 printf("%d\n", strlen(arr + 0)); //随机值 //printf("%d\n", strlen(*arr)); //error //printf("%d\n", strlen(arr[1])); //error printf("%d\n", strlen(&arr)); //随机值 printf("%d\n", strlen(&arr + 1)); //比第一个随机值少6 printf("%d\n", strlen(&arr[0] + 1)); //比第一个随机值少1 system("pause"); return 0; }
- strlen(arr) arr表示首元素的地址,所以字符串的长度从首元素开始数,但由于没有字符串结束标志'\0';所以为随机值。
- strlen(arr+0) arr表示首元素的地址,arr+0也表示首元素的地址,所以字符串的长度从首元素开始数,但由于没有字符串结束标志'\0';所以为随机值(和1的随机值相等)。
- strlen(*arr) arr表示首元素的地址,*arr表示首元素‘a’,'a'的ascii值为97;即为strlen(97),但strlen()括号里面应该为地址值,所以错误。
- strlen(arr[1])arr[1]表示第二个元素‘b’,'b'的ascii值为98;即为strlen(98),但strlen()括号里面应该为地址值;所以错误;
- strlen(&arr) &arr表示数组(首元素)的地址,所以字符串的长度从首元素开始数,但由于没有字符串结束标志'\0';所以为随机值(和1的随机值相等)。
- strlen(&arr+1) &arr表示整个数组的地址;&arr+1表示跳过整个数组,下一个元素的地址;由于没有字符串结束标志‘\0’,所以为随机值(比1的随机值小6)。
- strlen(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址,由于没有字符串结束标志‘\0’,所以为随机值(比1的随机值小1)。
#include<stdio.h> #include<stdlib.h> int main() { char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); //7 printf("%d\n", sizeof(arr + 0)); //4 printf("%d\n", sizeof(*arr)); //1 printf("%d\n", sizeof(arr[1])); //1 printf("%d\n", sizeof(&arr)); //4 printf("%d\n", sizeof(&arr + 1)); //4 printf("%d\n", sizeof(&arr[0] + 1));//4 system("pause"); return 0; }
- sizeof(arr) 数组名单独放在sizeof内部,表示整个数组的大小,整个数组7个元素,每个元素有1个字节,总共7个字节。
- sizeof(arr+0) 数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;arr+0也表示首元素的地址,地址占4个字节。
- sizeof(*arr) 数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;*arr表示首元素,字符型元素占1个字节。
- sizeof(arr[1]) arr[1]表示第二个元素,字符型元素占1个字节。
- sizeof(&arr) 数组名没有单独放在sizeof内部,数组名前有&,所以&arr表示整个数组的地址,地址占4个字节。
- sizeof(&arr+1) 数组名没有单独放在sizeof内部,数组名前有&,所以&arr表示整个数组的地址,&arr+1表示跳过整个数组的下一个元素的地址;地址为4个字节。
- sizeof(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址;地址为4个字节。
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char arr[] = "abcdef"; printf("%d\n", strlen(arr)); //6 printf("%d\n", strlen(arr + 0)); //6 // printf("%d\n", strlen(*arr)); //error // printf("%d\n", strlen(arr[1])); //error printf("%d\n", strlen(&arr)); //6 printf("%d\n", strlen(&arr + 1)); //随机值 printf("%d\n", strlen(&arr[0] + 1));//5 system("pause"); return 0; }
- strlen(arr) arr表示首元素的地址,所以字符串的长度从首元素开始数,为6
- strlen(arr+0) arr表示首元素的地址,arr+0也表示首元素的地址,所以字符串的长度从首元素开始数,为6
- strlen(*arr) arr表示首元素的地址,*arr表示首元素‘a’,'a'的ascii值为97;即为strlen(97),但strlen()括号里面应该为地址值,所以错误。
- strlen(arr[1])arr[1]表示第二个元素‘b’,'b'的ascii值为98;即为strlen(98),但strlen()括号里面应该为地址值;所以错误;
- strlen(&arr) &arr表示数组(首元素)的地址,所以字符串的长度从首元素开始数,为6。
- strlen(&arr+1) &arr表示整个数组的地址;&arr+1表示跳过整个数组,下一个元素的地址;由于没有字符串结束标志‘\0’,所以为随机值。
- strlen(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址,为5。
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *p = "abcdef"; printf("%d\n", sizeof(p)); //4 printf("%d\n", sizeof(p+1)); //4 printf("%d\n", sizeof(*p)); //1 printf("%d\n", sizeof(p[0])); //1 printf("%d\n", sizeof(&p)); //4 printf("%d\n", sizeof(&p + 1)); //4 printf("%d\n", sizeof(&p[0] + 1));//4 system("pause"); return 0; }
- sizeof(p) p是指针变量,存放a的地址,地址为4个字节。
- sizeof(p+1) p是指针变量,存放a的地址,p+1存放b的地址,地址为4个字节。
- sizeof(*p) p是指针变量,存放a的地址,*p表示元素a ,为1个字节。
- sizeof(p[0]) p[0]=*(p+0),表示元素a,为1个字节。
- sizeof(&p) 指针变量p的地址,为4个字节。
- sizeof(&p+1) 指向跳过p的下一个元素的地址。为4个字节
- sizeof(&p[0]+1) p[0]表示元素a,&p[0]为元素a的地址,加1为b的地址,4个字节。
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *p = "abcdef"; printf("%d\n",strlen(p)); //6 printf("%d\n", strlen(p + 1)); //5 // printf("%d\n", strlen(*p)); //error // printf("%d\n", strlen(p[0])); //error printf("%d\n", strlen(&p)); //随机值 printf("%d\n", strlen(&p + 1)); //随机值 printf("%d\n", strlen(&p[0] + 1));//5 system("pause"); return 0; }
- strlen(p) p为指针变量,存放a的地址,从a向后数为6。
- strlen(p+1) p为指针变量,存放a的地址,p+1存放b的地址,从b向后数为5.
- strlen(*p) p为指针变量,存放a的地址,*p表示元素a,元素a的ascii为97,但strlen()括号里面应该是地址,所以错误。
- strlen(p[1])p[1]表示第二个元素b,b的ascii码为98,但strlen()括号里面应该是地址,所以错误。
- strlen(&p)p为指针变量存放a的地址,但&p表示p的地址,我们并不知道p的地址有几位,所以为随机值。
- strlen(&p+1) p为指针变量存放a的地址,但&p表示p的地址,&p+1表示跨过p的下一个元素地址,后面的地址是什么我们无法确定,所以为随机值。
- strlen(&p[0]+1) p[0]表示a,&p[0]为a的地址,&p[0]+1表示b的地址,从b向后数为5.
二维数组
eg: a[3][4] 表示一个三行四列的数组,数组名为a。
我们可以把第一行的数组名当作a[0];可以把第二行的数组名当作a[1]; 可以把第三行的数组名当作a[2];
#include<stdio.h> #include<stdlib.h> int main() { //二维数组 int a[3][4] = { 0 }; printf("%d\n", sizeof(a)); //48 printf("%d\n", sizeof(a[0][0])); //4 printf("%d\n", sizeof(a[0])); //16 printf("%d\n", sizeof(a[0]+1)); //4 printf("%d\n", sizeof(a + 1)); //4 printf("%d\n", sizeof(&a[0] + 1));//4 printf("%d\n", sizeof(*a)); //16 printf("%d\n", sizeof(a[3])); //16 system("pause"); return 0; }
- sizeof(a) 数组名单独放在了sizeof内部,表示整个数组的大小,共12个元素,一个元素4个字节,共48个字节。
- sizeof(a[0][0]) a[0][0]表示a[0][0]的地址,为4个字节。
- sizeof(a[0]) 数组名单独sizeof内部,表示整个数组的大小,4个元素,一个元素4个字节,一共16个字节。
- sizeof(a+1) 数组名没有单独放在sizeof内部,数组名前没有&,所以a表示首元素a[0]的地址,a+1为第二行的地址。
- sizeof(&a[0]+1) 数组名没有单独放在sizeof内部,数组名有&,表示数组a[0]的地址,&a[0]+1表示数组a[1]的地址。
- sizeof(*a) 数组名没有单独放在sizeof内部,数组名前没有&,所以a表示首元素a[0]的地址,*a表示首元素,一共4个元素,每个元素4个字节,共16个字节。
- sizeof(a[3]) 数组名单独sizeof内部,表示整个数组的大小,4个元素,一个元素4个字节,一共16个字节。