Algunos temas sobre punteros en lenguaje C (1)

Lo primero que hay que notar es:

1, &Nombre del arreglo, el nombre del arreglo aquí también representa el arreglo completo, y se quita la dirección del arreglo, no la dirección del primer elemento del arreglo. La diferencia entre los dos no se repite en este artículo. Si Si tiene alguna pregunta, consulte la información usted mismo.

2. La sintaxis estipula: sizeof (nombre de matriz), cuando solo hay un único nombre de matriz , sizeof (nombre de matriz) calcula el tamaño de toda la matriz.

3. Excepto en los casos anteriores, todos los nombres de arreglos son la dirección del primer elemento del arreglo .

4, sizeof solo presta atención al tamaño del espacio ocupado, la unidad son bytes, sizeof no presta atención al tipo.sizeof es un operador

5. Hasta \0 en la cadena a la que strlen presta atención, calcula cuántos caracteres aparecen antes de \ 0. El puntero strlen es una función de biblioteca para cadenas .

6. Para fortalecer la memoria y la distinción, siempre que se trate de declaraciones clave como la dirección del primer elemento de la matriz, la dirección de la matriz , etc., se resaltará en negrita y, al mismo tiempo, la Se escribe el proceso de análisis de cada uno.

1. ¿Cuál es el resultado impreso por las siguientes declaraciones?

//一维数组
int a[] = {1,2,3,4};

printf("%d\n",sizeof(a));//1
printf("%d\n",sizeof(a+0));//2
printf("%d\n",sizeof(*a));//3
printf("%d\n",sizeof(a+1));//4
printf("%d\n",sizeof(a[1]));//5
printf("%d\n",sizeof(&a));//6
printf("%d\n",sizeof(*&a));//7
printf("%d\n",sizeof(&a+1));//8
printf("%d\n",sizeof(&a[0]));//9
printf("%d\n",sizeof(&a[0]+1));//10

Analizar gramaticalmente:

01 16. El nombre de la matriz a se coloca solo dentro de sizeof , se calcula el tamaño de toda la matriz y el tamaño es de 4*4 bytes (las siguientes unidades son todos bytes, se omiten)

02 4/8 (32 bits son 4 arriba, 64 bits son 8 arriba, y lo mismo es cierto para 4/8 abajo) El nombre del arreglo a no se coloca solo en él, representa la dirección del primer elemento del array y el tamaño de la dirección es 4/8;

03 4.a no se coloca solo en él , es la dirección del primer elemento del arreglo , y se saca el elemento 1 después de *, es de tipo int, y su tamaño es 4;

04 4/8.a no se coloca solo , es la dirección del primer elemento del arreglo , en +1, es la dirección de la dirección 2 del segundo elemento del arreglo, y el tamaño de la dirección es 4/8;

05 4.a no se coloca solo en él , es la dirección del primer elemento del arreglo, en [1] es el segundo elemento del arreglo, el tipo es int y el tamaño es 4;

06 4 /8. &Nombre de la matriz , que indica la dirección de la matriz, la dirección de la matriz también es la dirección y el tamaño de la dirección es 4/8;

07 16. Obtenga la dirección de (&) a, en *, que es equivalente a cancelar los dos, o separar a. El nombre de la matriz a se coloca solo dentro de sizeof, y se calcula el tamaño de toda la matriz, y el el tamaño es 4*4;

08 4 /8. &Nombre de la matriz , que indica la dirección de la matriz .&a Obtenga la dirección de la matriz a, en +1, omita toda la matriz a, apunte a la siguiente dirección, el tamaño de la dirección es 4/8;

09 4/8. ¡Presta atención a la prioridad! La prioridad []>& (toma el carácter de la dirección). a[0], el primer elemento de la matriz, en & es su dirección. El tamaño de la dirección es 4/ 8;

10 08/04 ¡ Presta atención a la prioridad! Prioridad[]>& (toma el carácter de la dirección).a[0], el primer elemento de la matriz, en & es su dirección, agregar 1 sigue siendo la dirección, es el segundo en la matriz La dirección del elemento (el tipo de datos determina cuánto tiempo puede durar el puntero al agregar 1, es un tipo int, y al agregar 1 salta 4 bytes al segundo elemento). El tamaño de la dirección es 4 /8;

2. ¿Cuál es el resultado impreso por cada una de las siguientes declaraciones?

//字符数组
char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", sizeof(arr));//1
printf("%d\n", sizeof(arr+0));//2
printf("%d\n", sizeof(*arr));//3
printf("%d\n", sizeof(arr[1]));//4
printf("%d\n", sizeof(&arr));//5
printf("%d\n", sizeof(&arr+1));//6
printf("%d\n", sizeof(&arr[0]+1));//7
printf("%d\n", strlen(arr));//8
printf("%d\n", strlen(arr+0));//9
printf("%d\n", strlen(*arr));//10//运行时需要注释掉
printf("%d\n", strlen(arr[1]));//11//运行时需要注释掉
printf("%d\n", strlen(&arr));//12
printf("%d\n", strlen(&arr+1));//13
printf("%d\n", strlen(&arr[0]+1));//14

Analizar gramaticalmente:

01 6. El nombre de la matriz arr se coloca solo dentro de sizeof , se calcula el tamaño de toda la matriz y el tamaño es de 1 * 6 bytes. ¡No crea que es una cadena aquí, es solo una matriz de caracteres!

02 4/8.El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , y si es +0, no tiene efecto.El tamaño de la dirección es 4/8;

03 1. El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , en * se obtiene este elemento, el tamaño del tipo char es 1;

04 1. El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , que es el segundo elemento.El tamaño del tipo char es 1;

05 4 /8. &Nombre de la matriz , que indica la dirección de la matriz, la dirección de la matriz también es la dirección y el tamaño de la dirección es 4/8;

06 4/8 &Nombre del arreglo , indica la dirección del arreglo &arr obtiene la dirección del arreglo arr, en +1, salta todo el arreglo arr, apunta a la siguiente dirección, el tamaño de la dirección es 4/8;

 07 08/04 ¡ Presta atención a la prioridad!Prioridad[]>& (tomar el carácter de dirección).arr[0] es el primer elemento de la matriz, en & es su dirección, agregar 1 sigue siendo la dirección, es el segundo en la matriz La dirección del elemento (el tipo de datos determina cuánto tiempo puede durar el puntero al agregar 1, es un tipo char, y al agregar 1 salta 1 byte al segundo elemento). El tamaño de la dirección es 4/ 8;

08 Valor aleatorio. El nombre de la matriz arr no se coloca solo en ella , representa la dirección del primer elemento de la matriz . La función strlen comienza a continuar desde esta dirección. Dado que no hay '\0' en la matriz de caracteres, el resultado es que no sé cuándo parar. Entonces, los resultados calculados en diferentes computadoras son diferentes. strlen se detendrá cuando encuentre '\0';

09 Valor aleatorio. El nombre de la matriz arr no se coloca solo en ella , representa la dirección del primer elemento de la matriz , en +0, sigue siendo la dirección de este elemento. La función strlen comienza a continuar desde esta dirección, porque no hay '\0' en la matriz de caracteres, el resultado es que no sé cuándo parar. Por lo tanto, los resultados calculados en diferentes computadoras son diferentes. strlen se detendrá cuando encuentre '\0';

10 Error. El nombre de la matriz arr no se coloca solo en ella , representa la dirección del primer elemento de la matriz . En *, se obtiene el elemento 'a'. Cuando el carácter se almacena en la memoria, el código ASCII, 'a' es la función 97.strlen Continúe usando 97 como una dirección, y el resultado es un conflicto de memoria de acceso;

11 Error. El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , arr[1], y se obtiene el elemento 'b'. Cuando el carácter se almacena en la memoria, el Código ASCII, 'b' es 98. La función strlen continúa caminando con 98 como dirección y el resultado es un conflicto de memoria de acceso;

12 Valor aleatorio. &Nombre de matriz , que indica la dirección de la matriz , aunque el tipo es diferente del tipo de parámetro de strlen, pero después de pasar el parámetro, aún se calcula a partir de la dirección del primer carácter, porque no hay ' \0' en la matriz de caracteres, el resultado es que no sabe cuándo detenerse. Por lo tanto, los resultados calculados en diferentes computadoras son diferentes. strlen se detendrá cuando encuentre '\0';

13         Valor aleatorio. &Nombre de la matriz , que indica la dirección de la matriz , aunque el tipo es diferente del tipo de parámetro de strlen, pero después de pasar el parámetro, +1, omita esta matriz de caracteres y comience el cálculo, porque este último no Conozco la posición '\0', el resultado es que no sé cuándo parar. Por lo tanto, los resultados calculados en diferentes computadoras son diferentes. strlen se detendrá cuando encuentre '\0';

14 Valor aleatorio. ¡Preste atención a la prioridad! Prioridad []> & (tome el carácter de la dirección). arr [0], el primer elemento de la matriz, en & es su dirección, agregar 1 sigue siendo la dirección, es el segundo elemento de la dirección de la matriz (el tipo de datos determina cuánto tiempo puede durar el puntero al agregar 1, es un tipo char, y al agregar 1 salta 1 byte al segundo elemento), aunque el tipo es diferente del tipo de parámetro de strlen , pero el parámetro se pasa Después del pasado, el cálculo comienza desde la dirección del segundo carácter. Como no hay '\0' en la matriz de caracteres, el resultado es que no sabe cuándo detenerse. Por lo tanto, el cálculo los resultados son diferentes en diferentes equipos . Se detendrá hasta '\0';

char arr[] = "abcdef";

printf("%d\n", sizeof(arr));//1
printf("%d\n", sizeof(arr+0));//2
printf("%d\n", sizeof(*arr));//3
printf("%d\n", sizeof(arr[1]));//4
printf("%d\n", sizeof(&arr));//5
printf("%d\n", sizeof(&arr+1));//6
printf("%d\n", sizeof(&arr[0]+1));//7
printf("%d\n", strlen(arr));//8
printf("%d\n", strlen(arr+0));//9
printf("%d\n", strlen(*arr));//10//运行时需要注释掉
printf("%d\n", strlen(arr[1]));//11//运行时需要注释掉
printf("%d\n", strlen(&arr));//12
printf("%d\n", strlen(&arr+1));//13
printf("%d\n", strlen(&arr[0]+1));//14

Analizar gramaticalmente:

La matriz arr aquí representa cadenas.

01 7. El nombre de la matriz arr se coloca dentro de sizeof solo , y se calcula el tamaño de la cadena completa + '\0', y el tamaño es 1*7 bytes.

02 4/8.El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , y si es +0, no tiene efecto.El tamaño de la dirección es 4/8;

03 1. El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , en * se obtiene este elemento, el tamaño del tipo char es 1;

04 1. El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , que es el segundo elemento.El tamaño del tipo char es 1;

05 4 /8. &Nombre de la matriz , que indica la dirección de la matriz, la dirección de la matriz también es la dirección y el tamaño de la dirección es 4/8;

06 4/8 &Nombre del arreglo , indica la dirección del arreglo &arr obtiene la dirección del arreglo arr, en +1, salta todo el arreglo arr, apunta a la siguiente dirección, el tamaño de la dirección es 4/8;

 07 4/8 ¡Presta atención a la prioridad! Priority[]>& (toma el carácter de la dirección). arr[0] es el primer elemento de la matriz, en & es su dirección, agregar 1 sigue siendo la dirección, es el segundo en la matriz La dirección del elemento (el tipo de datos determina cuánto tiempo puede durar el puntero al agregar 1, es un tipo char, y al agregar 1 salta 1 byte al segundo elemento). El tamaño de la dirección es 4 /8;

08 6. El nombre de la matriz arr no se coloca solo en ella , representa la dirección del primer elemento de la matriz . La función strlen comienza a continuar desde esta dirección. Como se agrega '\0' al final de la cadena, se puede calcular el tamaño strlen encuentra '\ 0' se detendrá;

09 6. El nombre de la matriz arr no se coloca solo en ella , representa la dirección del primer elemento de la matriz , arr está en +0, o esta dirección. La función strlen comienza a continuar desde esta dirección. Desde '\0 ' se agrega al final de la cadena, se puede Calcular el tamaño. strlen se detendrá cuando encuentre '\0';

10 Error. El nombre de la matriz arr no se coloca solo en ella , representa la dirección del primer elemento de la matriz . En *, se obtiene el elemento 'a'. Cuando el carácter se almacena en la memoria, el código ASCII, 'a' es la función 97.strlen Continúe usando 97 como una dirección, y el resultado es un conflicto de memoria de acceso;

11 Error. El nombre del arreglo arr no se coloca solo en él , representa la dirección del primer elemento del arreglo , arr[1], y se obtiene el elemento 'b'. Cuando el carácter se almacena en la memoria, el Código ASCII, 'b' es 98. La función strlen continúa caminando con 98 como dirección y el resultado es un conflicto de memoria de acceso;

12 6. &Nombre de la matriz , que indica la dirección de la matriz , aunque el tipo es diferente del tipo de parámetro de strlen, pero después de que se pasa el parámetro, aún comienza a calcularse desde la dirección del primer carácter, y comienza la función strlen para continuar desde esta dirección, porque se agrega '\0' al final de la cadena, por lo que se puede calcular el tamaño.strlen se detendrá cuando encuentre '\0';

13         Valor aleatorio. &Nombre de la matriz , que indica la dirección de la matriz , aunque el tipo es diferente del tipo de parámetro de strlen, pero después de pasar el parámetro, +1, omita esta cadena para comenzar el cálculo, porque la última no sabe la posición '\0', el resultado es que no sé cuándo parar. Por lo tanto, los resultados calculados en diferentes computadoras son diferentes. strlen se detendrá cuando encuentre '\0';

14 Valor aleatorio. ¡Preste atención a la prioridad! Prioridad []> & (tome el carácter de la dirección). arr [0], el primer elemento de la matriz, en & es su dirección, agregar 1 sigue siendo la dirección, es el segundo elemento de la dirección de la matriz (el tipo de datos determina cuánto tiempo puede durar el puntero al agregar 1, es un tipo char, y al agregar 1 salta 1 byte al segundo elemento), aunque el tipo es diferente del tipo de parámetro de strlen , pero el parámetro se pasa Después del pasado, el cálculo comienza desde la dirección del segundo carácter. Como no hay '\0' en la matriz de caracteres, el resultado es que no sabe cuándo detenerse. Por lo tanto, el cálculo los resultados son diferentes en diferentes equipos . Se detendrá hasta '\0';

char *p = "abcdef";

printf("%d\n", sizeof(p));//1
printf("%d\n", sizeof(p+1));//2
printf("%d\n", sizeof(*p));//3
printf("%d\n", sizeof(p[0]));//4
printf("%d\n", sizeof(&p));//5
printf("%d\n", sizeof(&p+1));//6
printf("%d\n", sizeof(&p[0]+1));//7
printf("%d\n", strlen(p));//8
printf("%d\n", strlen(p+1));//9
printf("%d\n", strlen(*p));//10//运行时需要注释掉
printf("%d\n", strlen(p[0]));//11运行时需要注释掉
printf("%d\n", strlen(&p));//12
printf("%d\n", strlen(&p+1));//13
printf("%d\n", strlen(&p[0]+1));//14

Analizar gramaticalmente:

01 4/8.p es una variable de puntero, que almacena la dirección.Sizeof(p) calcula el tamaño de la variable de puntero.El tamaño del puntero es 4/8;

02 4/8.p es una variable de puntero, que almacena la dirección. En +1, sigue siendo la dirección. El tamaño de la dirección es 4/8;

03 1.p es una variable puntero, en *, obtenga este elemento.El tamaño del tipo char es 1;

04 1.p es una variable puntero, combinada con [0], equivalente a *(p + 0), o el tamaño de *p.char tipo es 1;

05 4/8.p es una variable de puntero, en &, obtienes la dirección de esta variable de puntero.El tamaño de la dirección es 4/8;

06 4/8.p es una variable de puntero, en & obtienes la dirección de esta variable de puntero En +1, todavía apunta a una dirección, y el tamaño de la dirección es 4/8;

 07 4/8 ¡Presta atención a la prioridad! Prioridad[]>& (toma el carácter de dirección).p[0] es el primer elemento de la matriz, en & es su dirección, agregando 1 sigue siendo la dirección, es el segundo en la matriz La dirección del elemento (el tipo de datos determina cuánto tiempo puede durar el puntero al agregar 1, es un tipo char, y al agregar 1 salta 1 byte al segundo elemento). El tamaño de la dirección es 4 /8;

08 6.p almacena la dirección de 'a'. La función strlen comienza a continuar desde esta dirección. Dado que se agrega '\0' al final de la cadena, se puede calcular el tamaño. Strlen se detendrá cuando encuentre '\ 0';

09 5.p almacena la dirección de 'a', en +1, es la dirección de 'b', la función strlen comienza a continuar desde esta dirección, ya que se agrega '\0' al final de la cadena, el se puede calcular el tamaño strlen se detendrá cuando encuentre '\0';

10 Error. p es una variable puntero. En *, se obtiene el elemento 'a'. Cuando el carácter se almacena en la memoria, el código ASCII, 'a' es 97. La función strlen continúa con 97 como dirección , y el resultado es el conflicto de memoria de acceso;

11 Error. p es una variable de puntero, obtenga el elemento 'a' en * y obtenga 'b' en + 1. Cuando el carácter se almacena en la memoria, el código ASCII, 'b' es la función 98.strlen Continúe con use 98 como dirección y el resultado es un conflicto de memoria de acceso;

12 Valor aleatorio.p es una variable puntero, en & se obtiene la dirección de p, no la dirección de "abcdef", la función strlen comienza a continuar desde esta dirección.strlen se detendrá cuando encuentre '\0';

13         Valor aleatorio.p es una variable puntero, en &, obtiene la dirección de p, en +1, es otra dirección, no la dirección de "abcdef", la función strlen comienza a continuar desde esta dirección.strlen encuentra '\ 0' se detendrá;

14 Valor aleatorio.¡Presta atención a la prioridad!Prioridad[]>& (carácter de dirección).p[0], el primer elemento de la matriz, en & es su dirección, y agregando 1 sigue siendo la dirección, es el segundo elemento de la dirección de matriz (el tipo de datos determina cuánto tiempo puede durar el puntero al agregar 1, es un tipo de carácter, agregar 1 omitirá 1 byte y alcanzará el segundo elemento), después de pasar el parámetro, comienza a calcular desde la dirección del segundo carácter, la función strlen comienza a continuar desde esta dirección. strlen se detendrá cuando encuentre '\0';

3. ¿Cuál es el resultado impreso por las siguientes declaraciones?

//二维数组
int a[3][4] = {0};

printf("%d\n",sizeof(a));//1
printf("%d\n",sizeof(a[0][0]));//2
printf("%d\n",sizeof(a[0]));//3
printf("%d\n",sizeof(a[0]+1));//4
printf("%d\n",sizeof(*(a[0]+1)));//5
printf("%d\n",sizeof(a+1));//6
printf("%d\n",sizeof(*(a+1)));//7
printf("%d\n",sizeof(&a[0]+1));//8
printf("%d\n",sizeof(*(&a[0]+1)));//9
printf("%d\n",sizeof(*a));//10
printf("%d\n",sizeof(a[3]));//11

Analizar gramaticalmente:

01 48. El nombre de la matriz a se coloca dentro de sizeof solo , se calcula el tamaño de toda la matriz y el tamaño es 4*3*4 bytes;

02 4.a no se coloca solo , es la dirección del primer elemento de la matriz, a[0][0] significa obtener la primera fila y obtener el primer elemento de esta fila, es de tipo int , el tamaño es 4;

03 16.a no se coloca solo en él , es la dirección del primer elemento del arreglo, donde el primer elemento es el arreglo completo de la primera fila, el tamaño es 4*4;

04 4/8.a no se coloca solo , es la dirección del primer elemento de la matriz , en +1, es el segundo elemento de la primera fila de la matriz, y el tamaño de la dirección es 4 /8;

05 4.a no se coloca solo en él , es la dirección del primer elemento de la matriz, [0] indica que es el elemento de la primera fila, en +1, la dirección del segundo elemento de esta fila se obtiene, en *, se obtiene Este elemento es de tipo int y tiene un tamaño de 4;

06 4/8.a no se coloca solo en él , es la dirección del primer elemento de la matriz, que es la primera línea. En +1, omita la primera línea, llegue a la segunda línea, obtenga la dirección del segunda línea, el tamaño de la dirección es 4/8;

07 16.a no se coloca solo en él , es la dirección del primer elemento de la matriz, que es la primera línea. En +1, omita la primera línea, llegue a la segunda línea, obtenga la dirección de la segunda línea. , en * , luego obtenga la matriz completa de esta fila, el tamaño es 4*4 ;

08 4/8.a[0] Obtenga la primera fila de esta matriz, donde & es la dirección de esta fila, en +1, omita esta fila y obtenga la dirección de la segunda fila, el tamaño de la dirección es 4 / 8;

09 16.a[0] Obtenga la primera fila de esta matriz, y & es la dirección de esta fila, en +1, omita esta fila, pase a la segunda fila y obtenga la segunda fila en * . int, el tamaño es 4*4 ;

10 16.a no se coloca solo en él , es la dirección del primer elemento del arreglo, es decir, esta línea.En *, obtener esta línea.Es de tipo int, y el tamaño es 4*4;

11 16.a no se coloca solo en él , es la dirección del primer elemento de la matriz, en [3], obtenga la cuarta fila. Aquí a[3] está fuera de los límites, pero sizeof no calcula el tamaño de a[3], de hecho, cuando calcula sizeof, solo le importa el tamaño del espacio ocupado.En su opinión, a[3] aquí es lo mismo que a[0] y a[1], que son los nombres de matriz de esta línea, entonces el tamaño es 4 * 4.

Enlaces a otros temas:

Algunos temas de los punteros del lenguaje C (2) _ Blog de Naion-CSDN blog icono-predeterminado.png?t=M0H8https://blog.csdn.net/Naion/article/details/122590308

Supongo que te gusta

Origin blog.csdn.net/Naion/article/details/122548523
Recomendado
Clasificación