在了解sizeof与strlen在数组中的应用之前我们需要明确两个要点:
2.strlen是从首元素开始直到\0才会停止,strlen接收的是地址
下面我们通过例题来加深理解:
1.对于整型一维数组
#include<stdio.h>
int main(){
int a[4] = { 0 };
printf("%d\n", sizeof(*a));//对首元素的地址进行解引用,表示首元素,类型为int 结果为4
printf("%d\n", sizeof(a[1]));//a[1]=*(a+1) 数组中第二个元素的地址,解引用为第二个元素,类型为int,结果为4
printf("%d\n", sizeof(&a));//表示整个数组的地址,为地址,大小为4
printf("%d\n", sizeof(*&a));//对整个数组的地址进行解引用,表示为整个数组,类型为int ,大小为4*4=16
printf("%d\n", sizeof(&a+1));//表示跳过整个数组的地址,仍为地址,大小为4
system("pause");
return 0;
}
2.对于字符型一维数组
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = { 'a', 'b', 'c', 'd','e','f' };
printf("%d\n", sizeof(a));//表示整个数组,类型为char, 结果为6*1=6
printf("%d\n", sizeof(a+0));//表示首元素的地址,是地址,大小为4
printf("%d\n", sizeof(&a[0]+1));//表示第二个元素的地址,为地址,大小为4
printf("%d\n", strlen(a));//获取的是首元素的地址并开始查找,因为数组中没有\0,故为随机值
printf("%d\n", strlen(a+1));//从第二个元素的地址开始查找,因为数组中没有\0,故为随机值
printf("%d\n", strlen(*a));//对首元素的地址进行解引用,表示获取的是第一个元素,而strlen只能获取地址,报错
system("pause");
return 0;
3.对于字符型指针数组
#include<stdio.h>
int main()
{
char *p = "abcdef";
printf("%d\n", sizeof(p));//指针变量内存放的是首元素的地址,是地址, 大小为4
printf("%d\n", sizeof(*p));//对首元素地址进行解引用,表示首元素,这里为a,大小为1
printf("%d\n", sizeof(p[0]));//p[0]=*(p+0) 对首元素地址进行解引用,表示首元素,这里为a,大小为1
printf("%d\n", sizeof(&p));//获取的是首元素的地址,为地址,大小为4
printf("%d\n", sizeof(&p + 1));//取出指针变量p的地址,&p+1,表示跳过所指类型为char的大小,但仍未地址,大小为4
system("pause");
return 0;
}
4.二位整型数组
#include<stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//表示整个二维数组,类型为int,大小为4*3*4=48
printf("%d\n", sizeof(a[0][0]));//表示首元素地址,为地址,大小为4
printf("%d\n", sizeof(a[0]));//a[0]单独存在, 表示对首行元素,类型为int,大小为4*4=16;
printf("%d\n", sizeof(a[0] + 1));//获取的是首行元素的首地址,+为首行元素第二个元素的地址,为地址,大小为4
printf("%d\n", sizeof(a + 1));//为第一行元素的地址,&a+1,表下一行元素的地址,但仍未地址,大小为4
printf("%d\n", sizeof(a[3]));//为第三行元素,尽管值属性不存在,但类型属性存在,为int类型,大小为4*4=16
system("pause");
return 0;
}
这是我所整理的在数组中的应用,如果还有别的补充,希望大家留言评论,谢谢!