A deep understanding of sizeof and strlen in 5 minutes

1. What are sizeof and strlen?

sizeof is an operator keyword, not a function, the function is to return the size of a variable or type.
And strlen is a library function, and the function asks for the length of the string.

2. Case analysis

Before looking at the following case, you must understand the following sentences before proceeding with the steps of the following case:
1. The array name is placed in sizeof() alone, the array name represents the entire array, and the calculation is the size of the entire array, and the unit is Byte
2.&Array name, the array name represents the entire array, and the address of the entire array is taken out.
Except for the above two cases, all array names are the address of the first element of the array

Part 1

Part 1.1 use of sizeof in a one-dimensional array

	//1.一维数组
	int a[] = {
    
     1,2,3,4 };
	printf("%d\n", sizeof(a));         // sizeof(a)==16---数组名单独放在sizeof内部,计算的是数组总大小
	printf("%d\n", sizeof(a + 0));     // sizeof(a + 0)==4/8---a+0是第一个元素的地址
	printf("%d\n", sizeof(*a));        // sizeof(*a)==4---*a就是数组a的首元素
	printf("%d\n", sizeof(a + 1));     // sizeof(a + 1)==4/8---a+1是数组第二个元素的地址
	printf("%d\n", sizeof(a[1]));      // sizeof(a[1])==4---a[1]就是数组的第二个元素
	printf("%d\n", sizeof(&a));        // sizeof(&a)==4/8---&a是数组的地址,但是只要是地址就是4/8个字节
	printf("%d\n", sizeof(*&a));       // sizeof(*&a)==16---sizeof(*&a)==sizeof(a),计算的是数组总大小
	printf("%d\n", sizeof(&a+1));      // sizeof(&a + 1)==4/8---是一个地址,指向的是数组之后的空间
	printf("%d\n", sizeof(&a[0]));     // sizeof(&a[0])==4/8---是首元素地址
	printf("%d\n", sizeof(&a[0]+1));   // sizeof(&a[0] + 1)==sizeof(a[1])==4/8---是数组第二个元素的地址

Part 1.2 sizeof in a two-dimensional array

	//3.二维数组
	int a[3][4] = {
    
     0 };
	//printf("%p\n", &a[0][0]);
	//printf("%p\n", a[0]+1);
	//对于二维数组,数组名单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小
	printf("%d\n", sizeof(a));            // sizeof(a)==48
	printf("%d\n", sizeof(a[0][0]));	  // sizeof(a[0][0])==4
	printf("%d\n", sizeof(a[0]));         // sizeof(a[0])==16---a[0]是第一行的数组名,第一行的数组名单独放在sizeof内部
	                                      // 计算的是第一行这个数组的总大小

	printf("%d\n", sizeof(a[0] + 1));     // sizeof(a[0] + 1)==4/8---arr[0]作为第一行的数组名,并没有单独放在sizeof内部
	                                      // 所以数组名相当于数组首元素的地址,就是第一行第一个元素的地址
	                                      // a[0]+1---是第一行第二个元素的地址
	
	printf("%d\n", sizeof(*(a[0] + 1)));  // sizeof(*(a[0] + 1))==4---第一行第二个元素的大小
	printf("%d\n", sizeof(a + 1));        // sizeof(a + 1)==4/8---a作为二维数组的数组名,并没有&,也没有单独放在sizeof内部
	                                      // 那么数组名a就是首元素(第1行)的地址
	                                      // 所以a+1,也就是第2行的地址

	printf("%d\n", sizeof(*(a + 1)));     // sizeof(*(a + 1))==16---第二行的大小 *(a+1)==a[1]
	printf("%d\n", sizeof(&a[0] + 1));    // sizeof(&a[0] + 1)==4/8---&arr[0]是第一行的地址,+1就是第二行的地址
	printf("%d\n", sizeof(*(&a[0] + 1))); // sizeof(*(&a[0] + 1))==16---计算的是第二行的大小
	printf("%d\n", sizeof(*a));           // sizeof(*a)==16---*a==*(a+0)==a[0]
	                                      // a是二维数组得到数组名,没有&,也没有单独放在sizeof内部
	                                      // 所以a是二维数组首元素的地址,就是第一行的地址
	                                      // *a就是第一行的大小

	printf("%d\n", sizeof(a[3]));         // sizeof(a[3])==16
	                                      // a[3] - 明确了类型就可以计算大小
	return 0;
}

Part 2

Part 2.1 sizeof and strlen in character array

	//2.1字符数组
	char arr[] = {
    
     'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));         // sizeof(arr)==6---数组名arr,单独放在sizeof内部,计算的是数组总大小
	printf("%d\n", sizeof(arr + 0));     // sizeof(arr + 0)==4/8---arr是数组首元素的地址,地址就是4/8
	printf("%d\n", sizeof(*arr));        // sizeof(*arr)==1---*arr是数组首元素,计算的是首元素大小
	printf("%d\n", sizeof(arr[1]));      // sizeof(arr[1])==1---arr[1]数组的第二个元素
	printf("%d\n", sizeof(&arr));        // sizeof(&arr)==4/8---&arr虽然是数组的地址,但是只要是地址就是4/8个字节
	printf("%d\n", sizeof(&arr + 1));    // sizeof(&arr + 1)==4/8---&arr+1跳过了整个数组,指向了数组之后,但还是地址
	printf("%d\n", sizeof(&arr[0] + 1)); // sizeof(&arr[0] + 1)==4/8---&arr[0] + 1是第二个元素的地址


	printf("%d\n", strlen(arr));         // strlen(arr)==随机值---因为arr数组中原本没有'\0',就会在数组arr后继续找'\0'
	printf("%d\n", strlen(arr+0));       // strlen(arr + 0)==随机值
	//printf("%d\n", strlen(*arr));      // error,应该传递地址进去,而不是传字符进去
	//printf("%d\n", strlen(arr[1]));    // error,应该传递地址进去,而不是传字符进去
	printf("%d\n", strlen(&arr));        // strlen(&arr)==随机值
	printf("%d\n", strlen(&arr+1));      // strlen(&arr + 1)==随机值
	printf("%d\n", strlen(&arr[0]+1));   // strlen(&arr[0] + 1)==随机值

Part 2.2 sizeof and strlen in string

	//2.2字符串
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));           // sizeof(arr)==7---计算的是arr数组的总大小
	printf("%d\n", sizeof(arr + 0));       // sizeof(arr + 0)==4/8---arr+0是数组arr的首元素地址
	printf("%d\n", sizeof(*arr));          // sizeof(*arr)==1---首元素大小
	printf("%d\n", sizeof(arr[1]));        // sizeof(arr[1])==1---arr第二个元素的大小
	printf("%d\n", sizeof(&arr));          // sizeof(&arr)==4/8---&arr是数组的地址
	printf("%d\n", sizeof(&arr + 1));      // sizeof(&arr + 1)==4/8---&arr+1跳过了整个数组,指向了数组之后,但还是地址
	printf("%d\n", sizeof(&arr[0] + 1));   // sizeof(&arr[0] + 1)==4/8---第二个元素地址

	//传给strlen()必须是地址,不是地址都是error
	printf("%d\n", strlen(arr));           // strlen(arr)==6
	printf("%d\n", strlen(arr + 0));       // strlen(arr + 0)==6
	//printf("%d\n", strlen(*arr));        // error
	//printf("%d\n", strlen(arr[1]));      // error
	printf("%d\n", strlen(&arr));          // strlen(&arr)==6
	printf("%d\n", strlen(&arr + 1));      // strlen(&arr + 1)==随机值	
	printf("%d\n", strlen(&arr[0] + 1));   // strlen(&arr[0] + 1)==5


	//2.3字符串
	char* p = "abcdef";
	printf("%d\n", sizeof(p));         // sizeof(p)==4/8---p就是个指针变量
	printf("%d\n", sizeof(p + 1));     // sizeof(p + 1)==4/8---p + 1是的地址
	printf("%d\n", sizeof(*p));        // sizeof(*p)==1---p是字符指针,*p访问一个字节
	printf("%d\n", sizeof(p[0]));      // sizeof(p[0])==sizeof(*p)==sizeof(*(p+0))==1
	printf("%d\n", sizeof(&p));        // sizeof(&p)==4/8---&p是地址
	printf("%d\n", sizeof(&p + 1));    // sizeof(&p + 1)==4/8---&p+1是指向p后边空间的地址
	printf("%d\n", sizeof(&p[0] + 1)); // sizeof(&p[0] + 1)==4/8---&p[0]+1就是第二个元素的地址

	printf("%d\n", strlen(p));         // strlen(p)==6
	printf("%d\n", strlen(p + 1));     // strlen(p + 1)==5
	//printf("%d\n", strlen(*p));      // error
	//printf("%d\n", strlen(p[0]));    // error
	printf("%d\n", strlen(&p));        // strlen(&p)==随机值
	printf("%d\n", strlen(&p + 1));    // strlen(&p + 1)==随机值
	printf("%d\n", strlen(&p[0] + 1)); // strlen(&p[0] + 1)==5

to sum up

  1. The array name is placed in sizeof() alone, the array name represents the entire array, and the calculation is the size of the entire array, the unit is byte
    2.1 & array name, the array name represents the entire array, and the address of the entire array is divided by the above 2 types In addition to the situation, all array names are the address of the first element of the array.
    2.2 The sizeof operator calculates the size of the space occupied by the operand. When calculating the size, it does not care about the value placed in the memory.
    2.3 strlen() library function-ask [string 】Length is only used in: string, character array, when seeking length, only pay attention to'\0'

Guess you like

Origin blog.csdn.net/weixin_47812603/article/details/113771351