目录
-
一维数组
关于sizeof的使用:
//sizeof计算的是整个数组的大小,单位是字节
//当sizeof直接跟数组名,即sizeof(数组名),数组名表示的是整个数组,计算的是整个数组的大小
// &数组名-数组名表示整个数组,可取出数组的地址
//一般情况下数组名表示数组的首元素地址
接下来展示几个具体的例子
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//4*4=16字节
printf("%d\n", sizeof(a + 0));//4/8
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/8
printf("%d\n", sizeof(*&a));//16
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
(每条注释后面为打印内容)
执行结果
对于几个易混淆的表示以画图形式展示
sizeof(a+1)
//a+1跳过了一个整型
sizeof(a[0])----表示的是一个元素的大小
&a[0]+1表示是第二个元素的地址
&a+1 中&a是数组首元素的地址,加一则跳过整个数组
以上就是一维数组关于sizeof的使用,需要注意的是sizeof并非是一个函数
字符数组
关于字符数组,这里主要是sizeof和strlen两者的区别
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6字节
printf("%d\n", sizeof(arr + 0));//4/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8printf("%d\n", strlen(arr));//随机值,因为找不到\0的位置
printf("%d\n", strlen(arr + 0));//随机值
//printf("%d\n", strlen(*arr));//非法访问
//printf("%d\n", strlen(arr[1]));//‘b'-98被当成地址,但形参非法访问
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr + 1));//随机值-6
printf("%d\n", strlen(&arr[0] + 1));//随机值-1
strlen参数必须为地址或者指针,否则会出现非法访问(上述代码中两者注释掉的即是)
先展示运行结果
关于sizeof的结果这里不再一一解释,类似于上面的一维数组,读者自行学习。
重点来啦!!!
strlen是一个函数,用于计算长度,当遇到 \0即停止
接下来是字符数组的另外一种表示~
char arr[] = "abcdef";//a b c d e f \0
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr + 0));//4/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//6
//printf("%d\n", strlen(*arr));//非法访问
//printf("%d\n", strlen(arr[1]));//非法访问
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(&arr + 1));//12
printf("%d\n", strlen(&arr[0] + 1));//5
上述代码运行结果展示
此处依旧不对sizeof做解释,大致说一下strlen. 与之前不一样的是这一次使用的“abcdef"为
a b c d e f \0 自动生成一个\0 故strlen在读取的时候就不会停不下来,不再是一个随机值。剩下的就不再做解释了,与之前一样。
接下来是一个字符指针,其中sizeof不做展开,写其中几个典型的strlen就好了
int main()
{
char* p = "abcdef";
printf("%d\n", sizeof(p));//4/8
printf("%d\n", sizeof(p + 1));//'b'的地址,4/8
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//4/8
printf("%d\n", sizeof(&p + 1));//4/8
printf("%d\n", sizeof(&p[0] + 1));//4/8
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p + 1));//5,p+1是b的地址
//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));//5
}
运行结果
printf("%d\n", strlen(&p));//随机值
printf("%d\n", strlen(&p + 1));//随机值
这里出现随机值的原因:
二维数组
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]));
运行结果展示
printf("%d\n", sizeof(*(a[0] + 1)));
*(a[0]+1)为第一行第二列的元素,即4个字节
printf("%d\n", sizeof(a + 1));
a没有直接放在sizeof内部,故表示的是首元素的地址即第一行的地址 a[0],a+1即为第二行的地址
printf("%d\n", sizeof(*(a + 1)));
对第二行地址解引用则为第二行,4*4则为16
printf("%d\n", sizeof(&a[0] + 1));
&a[0]为第一行的地址,加1为第二行的地址---4/8
printf("%d\n", sizeof(*(&a[0] + 1)))
对第二行地址解引用则为第二行元素----4*4=16
printf("%d\n", sizeof(*a));
a表示的是数组首元素的地址
解引用第一行----16
printf("%d\n", sizeof(a[3]));
虽然没有a[3],但是由于sizeof不会进入内部,则仍为16
以上内容就到这里结束啦!
如有错误,可以指正,谢谢!