關於數組方面的大小計算

在這些問題的核心是:只有數組名單獨在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;
}




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