Una comprensión profunda de sizeof y strlen en 5 minutos

1. ¿Qué son sizeof y strlen?

sizeof es una palabra clave de operador, no una función, la función es devolver el tamaño de una variable o tipo.
Y strlen es una función de biblioteca, y la función pide la longitud de la cadena.

2. Análisis de casos

Antes de ver el siguiente caso, debe comprender las siguientes oraciones antes de continuar con los pasos del siguiente caso:
1. El nombre de la matriz se coloca solo en sizeof (), el nombre de la matriz representa la matriz completa y el cálculo es el tamaño de la matriz completa, y la unidad es Byte
2. & Nombre de la matriz, el nombre de la matriz representa la matriz completa, y se saca la dirección de toda la matriz.
Excepto en los dos casos anteriores, todos los nombres de matriz son la dirección de la primera elemento de la matriz

Parte 1

Parte 1.1 uso de sizeof en una matriz unidimensional

	//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---是数组第二个元素的地址

Parte 1.2 sizeof en una matriz bidimensional

	//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;
}

Parte 2

Parte 2.1 sizeof y strlen en matriz de caracteres

	//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)==随机值

Parte 2.2 tamaño de y strlen en cuerda

	//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

para resumir

  1. El nombre de la matriz se coloca solo en sizeof (), el nombre de la matriz representa la matriz completa y el cálculo es el tamaño de la matriz completa, la unidad es el byte
    2.1 y el nombre de la matriz, el nombre de la matriz representa la matriz completa y la dirección de toda la matriz se divide por los 2 tipos anteriores Además de la situación, todos los nombres de matriz son la dirección del primer elemento de la matriz.
    2.2 El operador sizeof calcula el tamaño del espacio ocupado por el operando. Al calcular el tamaño , no le importa el valor colocado en la memoria.
    2.3 strlen () función de biblioteca-ask [cadena】 La longitud solo se usa en: cadena, matriz de caracteres, cuando se busca la longitud, solo preste atención a '\ 0'

Supongo que te gusta

Origin blog.csdn.net/weixin_47812603/article/details/113771351
Recomendado
Clasificación