关于数组方面的大小计算

在这些问题的核心是:只有数组名单独在sizeof内部时,才代表整个数组,别的地方数组名一般都代表数组首元素地址,&+数组名,代表整个数组。

#include <stdio.h>
#include <stdlib.h>
int main(){

	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//   数组名a单独放在sizeof中代表整个数组  即 4*4=16
	printf("%d\n", sizeof(a + 0)); //   数组a不是单独放在sizeof中代表数组首元素地址  即 在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(*a));// 数组a不是单独放在sizeof中代表数组首元素地址,解引用 即a[0]一个整型的大小:   4
	printf("%d\n", sizeof(a + 1));// 数组a不是单独放在sizeof中代表数组首元素地址, 即a[1]的地址  即 在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(a[1]));//  相当于元素 2    一个整型的大小:   4
	printf("%d\n", sizeof(&a));//    取地址a,相当于整个数组的地址 但它还是地址 即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&a + 1));//   取地址a,相当于整个数组的地址 但它还是地址 &a+1就是下一个数组的地址  即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&a[0]));//    取元素的首地址  但它还是地址   即 在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&a[0] + 1));//  相当于第二元素地址  即 在32位平台为:4    64位平台为:8
system("pause");
	return 0;
}


#include <stdio.h>
#include <stdlib.h>
int main(){
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));// 数组名a单独放在sizeof中代表整个数组 即 为6个字符型 6;
	printf("%d\n", sizeof(arr + 0));//   数组arr不是单独放在sizeof中代表数组首元素地址,arr+0就是首元素地址    即 在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(*arr));//   数组arr不是单独放在sizeof中代表数组首元素地址,解引用相当于'a',即 大小为1;
	printf("%d\n", sizeof(arr[1]));// 相当于'b',即 大小为 1;
	printf("%d\n", sizeof(&arr));// 取地址arr,相当于整个数组的地址 但它还是地址 即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&arr + 1)); //  取地址arr,相当于整个数组的地址 但它还是地址 &arr + 1就是下一个数组的地址  即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&arr[0] + 1)); // 相当于第二元素地址  即 在32位平台为:4    64位平台为:8
	printf("%d\n", strlen(arr));//     数组名代表首元素地址 ,strlen 需要'\0'来结束,但是由于数组没有‘\0’,可能会越界访问程序出错;
	printf("%d\n", strlen(arr + 0));// 同上
	printf("%d\n", strlen(*arr));// 相当于字符'a',而strlen参数为一个地址所以可能会出错;
	printf("%d\n", strlen(arr[1]));// 同上
	printf("%d\n", strlen(&arr));// 取地址arr,相当于整个数组的地址  strlen 找下一个数组地址一直到'\0';
	printf("%d\n", strlen(&arr + 1));// 比上面少找一个数组,从arr后面的数组开始找;
	printf("%d\n", strlen(&arr[0] + 1));// 相当于从arr第二个元素地址开始找一直到'\0';
system("pause");
	return 0;
}





#include <stdio.h>
#include <stdlib.h>
int main(){
char *p = "abcdef";
	printf("%d\n", sizeof(p));  // p是一个地址 即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(p + 1));// 依然是一个地址 即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(*p));// 相当于'a' 大小 即 1
	printf("%d\n", sizeof(p[0]));// 相当于'a'的大小 即 1
	printf("%d\n", sizeof(&p));// 相当于p的地址 即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&p + 1)); // 下一个char*类型的指针的地址 即  在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&p[0] + 1));// 相当于b的地址  即  在32位平台为:4    64位平台为:8;
	printf("%d\n", strlen(p));//即 从a的地址开始  6;
	printf("%d\n", strlen(p + 1)); //即 从b的地址开始   5;
	printf("%d\n", strlen(*p));//*p代表'a'不是个地址,会出错

	printf("%d\n", strlen(&p));//  即 从p的地址开始找,直到'\0'
	printf("%d\n", strlen(&p + 1));// 即 从p的地址的下一个地址开始找,直到'\0'
	printf("%d\n", strlen(&p[0] + 1));// 即 'b'的地址开始找 即 5
system("pause");
	return 0;
}


#include <stdio.h>
#include <stdlib.h>
int main(){
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//  代表整个数组 即 3*4*4 = 48
	printf("%d\n", sizeof(a[0][0]));// 即第一个元素大小 4
	printf("%d\n", sizeof(a[0]));//  即第一行的大小 4*4=16
	printf("%d\n", sizeof(a[0] + 1));// 即 第一行的第二个元素地址 在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(a + 1));//即 第二行的地址 在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(&a[0] + 1));//  即 第2个元素的地址 在32位平台为:4    64位平台为:8
	printf("%d\n", sizeof(*a));// 即第一行的大小 4*4=16
	printf("%d\n", sizeof(a[3]));//  即 相当于第四行的大小 sizeof的括号内部不需要计算  16
	system("pause");
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章