C 有关数组的计算

sizeof()和strlen()有关数组的计算

注意:
1.数组名单独放在sizeof()内部,数组名表示整个数组,所以sizeof(数组名)计算的是整个数组的大小
2.&数组名,数组名表示整个数组,取出的是整个数组的地址;
3.除此之外,所有的数组名都是首元素的地址。

sizeof(c):计算c占几个字节;
strlen(arr):计算字符串长度,直至’\0’结束,’\0’不占长度;传给strlen的是个地址

//一维数组

int a[] = { 1, 2, 3, 4};

1.printf("%d\n", sizeof(a));//16
//计算整个数组长度,四个整形,一个整形4个字节,一共16字节

2.printf("%d\n", sizeof(a + 0));//4
//a是首元素地址,a+0表示第一个元素的地址,地址在32位上就是4个字节

3.printf("%d\n", sizeof(*a));//4
//a表示数组首元素的地址,*a是第一个元素的值
//数组为整形,所以一个字符占4个字节

4.printf("%d\n", sizeof(a + 1));//4
//同2,a+1是第二个元素的地址

5.printf("%d\n", sizeof(a [1] ));//4
//a[1]是数组的第二个元素,数组为整形,一个元素4个字节

6.printf("%d\n", sizeof(&a));//4
//对整个数组取地址,取出的是整个数组的地址,只要是地址就4个字节

7.printf("%d\n", sizeof(*&a));//16
//对整个数组取地址再解引用,得到的是整个数组的元素,
//数组包含4个元素,一个元素4个字节,一共16字节

8.printf("%d\n", sizeof(&a + 1));//4
//跳过整个数组的地址,得到的仍然是地址,还是4个字节

9.printf("%d\n", sizeof(&a[0]));//4
//a[0]是第一个元素,&a[0]就第一个元素的地址,就为4个字节

10.printf("%d\n", sizeof(&a[0] + 1));//4
//跳过第一个元素的地址,也就是第二个元素的地址,仍为4个字节
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};

1.printf("%d\n", sizeof(arr));//6
//计算整个数组长度,6个字符型,每个元素一个字节,一共6个字节

2.printf("%d\n", sizeof(arr + 0));//4
//arr为首元素地址,+0依然是首元素地址,地址就为4个字节

3.printf("%d\n", sizeof(*arr));//1
//对首元素地址解引用,得到第一个元素a,数组为字符型,所以占一个字节

4.printf("%d\n", sizeof(arr[1]));//1
//第二个元素b,字符型,一个字节

5.printf("%d\n", sizeof(&arr));//4
//对整个数组取地址,得到整个数组地址,所有地址均为4个字节

6.printf("%d\n", sizeof(&arr + 1));//4
//跳过整个数组的地址,得到下一个地址,仍为地址,仍然4个字节

7.printf("%d\n", sizeof(&arr[0] + 1));//4
//跳过第一个元素的地址,得到第二个元素的地址,4个字节
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};

1.printf("%d\n", strlen(arr));//随机值
//从第一个元素开始计算字符串长度,数组中没有'\0',
//无法停下来,所以会输出随机值

2.printf("%d\n", strlen(arr + 0));//随机值
//同上,也是从第一个元素开始,无法停止,输出随机值

3.printf("%d\n", strlen(*arr));//error
//strlen接受的是地址,*arr是首元素,strlen无法接收

4.printf("%d\n", strlen(arr[1]));//error
//同上,arr[1]是第二个元素,strlen也无法接收

5.printf("%d\n", strlen(&arr));//随机值
//取数组地址,数组地址与数组首元素地址在数值上相等,
//所以也是从数组第一个元素开始,无'\0',无法停止,为随机值

6.printf("%d\n", strlen(&arr + 1));//随机值
//跳过数组的地址之后开始,也为随机值,但与前面的相差6,因为跳过了6个

7.printf("%d\n", strlen(&arr[0] + 1));//随机值
//从第二个元素开始,为随机值,与前面的相差1,因为跳过了第一个元素
char arr[] = "abcdef";

1.printf("%d\n,sizeof(arr)");//7
//计算整个数组大小,'\0'自动给出,所以为7个字节

2.printf("%d\n,sizeof(arr + 0)");//4
//首元素地址+0,仍为首元素地址,地址占4个字节

3.printf("%d\n,sizeof(*arr)");//1
//对首元素地址解引用,得到首元素a,数组为字符类型,占一个字节

4.printf("%d\n,sizeof(arr[1])");//1
//数组中第二个元素b,也是字符类型,占一个字节

5.printf("%d\n,sizeof(&arr)");//4
//取整个数组地址,结果是地址,所以占4个字节

6.printf("%d\n,sizeof(&arr + 1)");//4
//跳过整个数组的地址,得到后面的地址,还是地址,所以仍是4个字节

7.printf("%d\n,sizeof(&arr[0] + 1)");//4
//跳过第一个元素的地址,得到第二个元素的地址,还是4个字节
char arr[] = "abcdef";

1.printf("%d\n,strlen(arr)");//6
//从第一个元素开始计算字符串长度,直到'\0'停止,一共6个元素

2.printf("%d\n,strlen(arr + 0)");//6
//与上面相同,一共6个元素

3.printf("%d\n,strlen(*arr)");//error
//strlen接受的是地址,*arr是首元素,strlen无法接收

4.printf("%d\n,strlen(arr[1])");//error
//同上,arr[1]是第二个元素,strlen也无法接收

5.printf("%d\n,strlen(&arr)");//6
//数组地址与数组首元素地址在数值上相等,所以也是从数组第一个元素开始计算,
//一共6个元素

6.printf("%d\n,strlen(&arr + 1)");//随机值
//跳过整个数组的地址,从后面开始计算,由于把'\0'也跳出去了,
//所以不一定什么时候停止,输出随机值

7.printf("%d\n,strlen(&arr[0] + 1)");//5
//跳过第一个元素的地址,从第二个元素开始计算,有5个元素
char *p = "abcdef";

1.printf("%d\n", sizeof(p));//4
//p为指针变量,存放的是地址,所以sizeof(p),求的就是地址,4个字节

2.printf("%d\n", sizeof(p + 1));//4
//p指向的是首元素的地址,p+1跳过第一个元素的地址,
//得到第二个元素的地址,仍为4个字节

3.printf("%d\n", sizeof(*p));//1
//对首元素地址解引用,得到首元素,数组为字符型,所以占一个字节

4.printf("%d\n", sizeof(p[0]));//1
//p[0]相当于*(p+0),是第一个元素,一个字节

5.printf("%d\n", sizeof(&p));//4
//对首元素地址取地址,仍是地址,所以4个字节
//(对&p的定义,(char * p = "abcdef")char* * pp = &p,
//第一个*表示pp指向的是char*类型的参数
//第二*表示pp是一个指针变量)

6.printf("%d\n", sizeof(&p + 1));//4
//同上,跳过p的地址,结果还是地址,占4个字节

7.printf("%d\n", sizeof(&p[0] + 1));//4
//同4,对第一个元素取地址+1,跳过第一个元素的地址,
//得到第二个元素的地址,占4个字节
char *p = "abcdef";

1.printf("%d\n", strlen(p));//6
//p指向的是首元素的地址,从首元素开始计算,一共6个元素

2.printf("%d\n", strlen(p + 1));//5
//p指向的是首元素的地址,p+1跳过第一个元素的地址,
//得到第二个元素的地址,从第二个元素开始计算,一共有5个

3.printf("%d\n", strlen(*p));//error
//strlen接受的是地址,*p是首元素,strlen无法接收

4.printf("%d\n", strlen(p[0]));//error
//同上,p[0]也是第1个元素,strlen也无法接收

5.printf("%d\n", strlen(&p));//随机值
//&p中的'\0'不一定在哪里,所以是随机值

6.printf("%d\n", strlen(&p + 1));//随机值
//同上

7.printf("%d\n", strlen(&p[0] + 1));//5
//取第一个元素的地址,然后跳过,得到第二个元素的地址,开始计算,有5个元素

//二维数组

int a[3][4] = {0};

1.printf("%d\n", sizeof(a));//48
//a单独放在sizeof内,表示的是整个数组,所求的是整个数组的大小,
//一共包含12个元素,整形数组中,每个元素占4个字节,一共48个字节

2.printf("%d\n", sizeof(a[0][0]));//4
//a[0][0]表示的是第一行第一列元素的地址,是整个数组的第一个元素的地址,
//只要是地址则为4个字节

3.printf("%d\n", sizeof(a[0]));//16
//首先要把二维数组看做一维数组,a[3][4]则相当于3个一维数组b[4],c[4],d[4]
//以b来举例,a[]就相当于b,b是数组b的数组名,也是数组a[][]的数组名,也就是
//a[]也是a[][]的数组名,所以相当于在sizeof单独放了一个数组名所以
//sizeof(a[0])也就是计算的第一行的总大小,一行有4个元素,每个元素有4个字节,
//总共16个字节

4.printf("%d\n", sizeof(a[0] + 1));//4
//同上,a[0]是b数组的首地址,则是第一行第一列的地址,+1则是第一行第二例
//元素的地址,地址则为4字节

5.printf("%d\n", sizeof(a + 1));//4
//同3,a表示的是第一行的地址,+1则表示第二行的地址,所以为4个字节

6.printf("%d\n", sizeof(&a[0] + 1));//4
//对第一行元素取地址,再+1,得到的是第二行的地址,为4个字节

7.printf("%d\n", sizeof(*a));//16
//解引用第一行的地址,得到的是第一行的元素,一共4个元素,每个元素4个字节
//总共16个字节

8.printf("%d\n", sizeof(a[3]));//16
//按理说应该是错误,但是sizeof()内部的表达式不参与运算,所以a[?],无论?
//是什么值,都与a[0]相同,计算的都是地址,只要是地址,都为4个字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值