您的位置:首页 > 其它

关于数组名在sizeof内部和在strlen内部

2017-11-02 20:20 267 查看
 //一维数组
int a[]={1,2,3,4};

printf("%d\n",sizeof(a));//16,数组名单独放在sizeof内部,表示整个数组,而sizeof求的是字节,所以输出16
printf("%d\n",sizeof(a+0));//4,数组名并不是单独放在sizeof内部,则a+0表示下标为0的地址,为数组a首元素的地址,地址大小为4个字节,所以输出4
printf("%d\n",sizeof(*a));//4,a没有单独放在sizeof内部,所以降级成为首元素的地址,对首元素的地址进行解引用表示首元素,a数组为整型数组,一个整型元素为4个字节,所以输出4
printf("%d\n",sizeof(a+1));//4,a+1表示a数组中第二个元素的地址
printf("%d\n",sizeof(a[1]));//4,a[1]表示a数组第二个元素,即2
printf("%d\n",sizeof(&a));//4,数组名前面加&符号,表示整个数组的地址,地址大小为4个字节printf("%d\n",sizeof(*&a));//16,&a表示整个数组的地址,对整个数组的地址解引用就是整个数组,所以输出为整个数组的大小
printf("%d\n",sizeof(&a+1));//4,&a表示整个数组的地址,数组的地址+1指向数组后面的地址,跳过了数组a,但仍然表示一个数组
printf("%d\n",sizeof(&a[0]));//4,&a[0]表示首元素的地址
printf("%d\n",sizeof(&a[0]+1));//4,&a[0]表示首元素的地址,则首元素的地址+1表示第二个元素的地址
//字符数组
char arr[]={'a','b','c','d','e','f'};

printf("%d\n",sizeof(arr));//6,数组名单独放在sizeof内部,表示整个数组,整个数组的大小为6
printf("%d\n",sizeof(arr+0));//4,arr+0表示数组首元素的地址,地址的大小都为4个字节
printf("%d\n",sizeof(*arr));//1,数组名未单独放在sizeof内部,对数组首元素的地址解引用为首元素,首元素为字符型,所以大小为1
printf("%d\n",sizeof(arr[1]));//1,arr[1]表示第二个元素
printf("%d\n",sizeof(&arr));//4,&arr表示数组的地址,是地址大小就为4printf("%d\n",sizeof(*&arr));//6,&arr表示整个数组的地址,对整个数组解引用则表示整个数组
printf("%d\n",sizeof(&arr+1));//4,数组的地址+1,表示跳过整个数组,到达f的后面的地址
printf("%d\n",sizeof(&arr[0]+1));//4,首元素的地址加1,表示第二个元素的地址
printf("%d\n",strlen(arr));//随机值,strlen求字符串长度,直到遇到‘\0‘才停止寻找
printf("%d\n",strlen(arr+0));//随机值,arr数组名表示首元素的地址,加0还是首元素的地址,同上
printf("%d\n",strlen(*arr));//程序崩溃,*arr表示‘a’,而strlen是从某个地址开始数字符,此时把97当成一个地址,无法访问
printf("%d\n",strlen(arr[1]));//程序崩溃,arr[1]表示第二个元素‘b’,理由同上
printf("%d\n",strlen(&arr));//随机值,数组首元素的地址,strlen求字符串长度,直到遇到‘\0‘才停止寻找
printf("%d\n",strlen(&arr+1));//随机值,&arr+1表示跳过整个数组,到达了‘f’的后面开始数,直到遇到‘\0’
printf("%d\n",strlen(&arr[0]+1));//随机值,从‘b’开始数char arr[]="abcdef";
printf("%d\n",sizeof(arr));//7,数组名单独放在sizeof内部表示整个数组,整个数组大小为7(包括'\0')
printf("%d\n",strlen(arr));//6,strlen求字符串长度,直到遇到‘\0‘才停止寻找,f后面有'\0'
printf("%d\n",strlen(arr+0));//6,同上
printf("%d\n",strlen(*arr));//程序崩溃,*arr表示‘a’,而strlen是从某个地址开始数,则从地址为97的地方开始数,无法访问
printf("%d\n",strlen(arr[1]));//程序崩溃,arr[1]表示第二个元素‘b’,理由同上
printf("%d\n",strlen(&arr));//6,从'a'所在的地址开始数,遇到'\0'结束
printf("%d\n",strlen(&arr+1));//随机值,&arr+1表示跳过整个数组,到达了‘\0’的后面开始数,直到遇到下一个‘\0’
printf("%d\n",strlen(&arr[0]+1));//5,从'b'所在的地址开始数,直到遇见'f'后面的'\0'
char *p="abcdef";
printf("%d\n",sizeof(p));//4,p为指针变量,指针变量的大小为4个字节
printf("%d\n",sizeof(p+1));//4,p里面是a的地址,p+1表示b的地址,地址大小为4
printf("%d\n",sizeof(*p));//1,p是字符指针,对字符指针解引用表示字符'a'
printf("%d\n",sizeof(p[0]));//1,p[0]表示'a'
printf("%d\n",sizeof(&p));//4,&p表示取出p的地址
printf("%d\n",sizeof(&p+1));//4,&P+1表示p后面的地址
printf("%d\n",sizeof(&p[0]+1));//4,&p[0]表示'a'的地址,则&p[0]+1表示'b'的地址
printf("%d\n",strlen(p));//6,指整个数组的长度(不算'\0')
printf("%d\n",strlen(p+1));//5,p里面存的是'a'的地址,+1表示'b'的地址,从'b'的地址开始数,直到遇见'\0'
printf("%d\n",strlen(*p));//程序崩溃,err,*p指'a',从地址为97开始数,无法访问
printf("%d\n",strlen(p[0]));//err,同上
printf("%d\n",strlen(&p));//随机值,&p表示p的地址,但是无法知道p里面的内容,从p的地址开始数,直到遇见'\0'
printf("%d\n",strlen(&p+1));//随机值,从p的地址后面开始数,直到遇见'\0'
printf("%d\n",strlen(&p[0]+1));//5,&p[0]表示'a'的地址,+1表示'b'的地址,从'b'的地址开始数,直到遇见'f'后面的'\0'
//二维数组
int a[3][4]={0};

printf("%d\n",sizeof(a));//48,数组名单独放在sizeof内部,表示整个数组
printf("%d\n",sizeof(a[0][0]));//4,a[0][0]表示第一个元素
printf("%d\n",sizeof(a[0]));//16,a[0]表示第一行的数组名,表示第一行整个数组,有4个元素
printf("%d\n",sizeof(a[0]+1));//4,a[0]+1表示第一行第二个元素的地址,理由:a[0]为第一行数组名,但a[0]并未单独放在sizeof内部,所以a[0]降级变为首元素地址, 即第一行第一个的元素的地址
printf("%d\n",sizeof(a+1));//4,数组名表示首元素的地址,二维数组首元素的地址表示第一行的地址,+1表示第二行的地址
printf("%d\n",sizeof(&a[0]+1));//4,&a[0]表示第一行的地址,+1表示第二行的地址
printf("%d\n",sizeof(*a));//16,数组名未单独放在sizeof内部,所以降级成为首元素的地址,首元素的地址为第一行的地址,解引用表示第一行
printf("%d\n",sizeof(a[3]));//16,a[3]不存在,但sizeof内部的表达式并不参与运算,所以a[3]表示第四行数组名,大小为16
总结:
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这里的数组名表示整个数组。
&数组名,这里的数组名表示整个数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: