当前位置:网站首页>- en résumé, ces dix mille ans de langue C sont - ils encore piétinés (chapitre de base) -

- en résumé, ces dix mille ans de langue C sont - ils encore piétinés (chapitre de base) -

2021-10-14 07:28:27 - Non.

 Table des matières

Un.,C'est écrit devant

2.,Base conceptuelle

1,Type de données

2,Taille du type de données

3,Variables locales et globales

4, Règles d'accès aux variables et portée et cycle de vie des variables

5,String

 6,Caractère d'évasion

7,strlen

8,Création de tableaux

9,Mots clés

10,Pointeur

Trois, Déclarations de branche et de boucle

1,ifDéclarations

2,switchDéclarations

3,Déclaration circulaire

 Quatre,Fonctions

1,Fonctions de bibliothèque

2,Fonction personnalisée

3,Appel de fonction

 4,Paramètres de la fonction

Cinq,Tableau

1, Création et initialisation de tableaux unidimensionnels .

2,Utilisation de tableaux unidimensionnels

3,Initialisation du tableau 2D

Six,Opérateur

1,Opérateur arithmétique

2,Déplacer l'opérateur

3,Opérateur de bits

4,Opérateur monoculaire

5,sizeofEt tableaux

6,Expression virgule

Sept,Pointeur

1,Qu'est - ce qu'un pointeur?

2,Dénouement du pointeur


Un.,C'est écrit devant

Nuages anciens,La répétition est la mère des études,Dans le processus d'apprentissage, Il n'y a qu'un examen continu , Pour atteindre le point de savoir qui peut être habile , Surtout si vous Examinez vos propres erreurs ou celles des gens ordinaires , Pour améliorer leur efficacité d'apprentissage . En cette fête nationale ,Bénissez la prospérité de la grande patrie,C Joyeuse fête nationale des amis debout . Si vous pensez que ce blog est assez bon ,Je t'en prie.,Collection demandée,Demande des commentaires, Votre triple connexion est la plus grande force motrice que j'ai faite ! Ce film se concentre sur l'introduction à la base , La version avancée sera bientôt mise à jour ,Ne dis pas de bêtises, Apprenons à .

2.,Base conceptuelle

1,Type de données

char        //Type de données de caractère
short       //Forme courte
int         //Remodelage
long        //Forme longue
long long   //Remodelage plus long
float       //Nombre de points flottants de précision unique
double      //Nombre de points flottants de double précision

Lequel n'est pas là - bas?C Types de données intégrés dans la langue :

A.char

B.double

C.struct Stu

D.short

  struct Le mot - clé est le type de structure que l'utilisateur utilise pour personnaliser ,Non.C Type intégré de langue .

  Donc,:SélectionnerC

2,Taille du type de données

#include <stdio.h>
int main()
{
    printf("%d\n", sizeof(char));
    printf("%d\n", sizeof(short));
    printf("%d\n", sizeof(int));
    printf("%d\n", sizeof(long));
    printf("%d\n", sizeof(long long));
    printf("%d\n", sizeof(float));
    printf("%d\n", sizeof(double));
    printf("%d\n", sizeof(long double));
    return 0;
}

3,Variables locales et globales

  Variables locales Les variables définies dans une fonction sont généralement appelées variables locales , Il ne peut être utilisé qu'à l'intérieur d'une fonction .

  Variables globalesVariables définies dans la portée globale, C'est - à - dire les variables en dehors de la fonction , Appelez ça une variable globale , Le cycle de vie des variables globales suit le démarrage du programme       Non., Mourir à la fin du programme , Peut être utilisé dans n'importe quelle fonction .

#include <stdio.h>
int global = 2019;//Variables globales
int main()
{
    int local = 2018;//Variables locales
    int global = 2020;//Variables locales
    printf("global = %d\n", global);
    return 0;
}

La portée de la variable locale est :

A.mainÀ l'intérieur de la fonction

B.Toute la procédure

C.mainAvant la fonction

D. La plage locale dans laquelle se trouve la variable locale

Attention!: Les variables globales sont faciles à utiliser , Mais pour prévenir les conflits et la sécurité , Essayez d'éviter de définir des variables globales .

  A:main La portée des variables locales définies à l'intérieur de la fonction est mainEn fonction, Mais les variables locales dans d'autres fonctions ne sont pas ,Donc,A Mauvais choix .

  B: La portée de la variable locale est à l'intérieur de la fonction , La variable globale est l'ensemble du programme ,Donc,B Mauvais choix

  C:mainAvant la fonction, C'est quelque chose que le système fait , Ce n'est donc pas juste

  D:Exact., C'est - à - dire dans le corps de la fonction

4, Règles d'accès aux variables et portée et cycle de vie des variables

Champ d'application

Champ d'application(scope),Concept de programmation,En général,,Les noms utilisés dans un code de programme ne sont pas toujours valides/Disponible De

La portée d'une variable locale est la portée locale de la variable.

La portée de la variable globale est l'ensemble du projet.

Cycle de vie

Le cycle de vie d'une variable est la période entre la création de la variable et sa destruction.

Le cycle de vie des variables locales est:Début du cycle de vie de la portée,Fin du cycle de vie de la portée sortante.

Le cycle de vie des variables globales est:Cycle de vie de l'ensemble du programme.

Le résultat de la sortie de code suivante est:( )

#include <stdio.h>
int num = 10;
int main()
{
    int num = 1;
    printf("num = %d\n", num);
	return 0;	
}

  Selon la description ci - dessus ,Pour les codes ci - dessus:

  1. Dans le champ d'application global numEtmainDansnumPeut exister en même temps,Pas de conflit, Parce que ce n'est pas le même champ d'application

  2. InmainAccès en fonctionnumHeure,Adopter le principe de proximité, C'est pour ça qu'on a visité mainDansnum, C'est l'équivalent de numC'est bloqué.

 A:Erreur:Parce que deuxnum Pas dans le même champ d'application ,Peut être compilé

 B:Exact.,main Dans le mainDansnum,EtmainEn fonctionnum- Oui.1,Alors imprimez1

 C:Erreur, Devrait visiter mainEn fonctionnum, Au lieu de num

 D:Erreur, Choisir

5,String

"hell0\n"

Ce sont des guillemets doubles(Double Quote)La chaîne de caractères citée est appelée la valeur littérale de la chaîne(String Literal), Ou une chaîne .

Le drapeau de fin de chaîne est :( )

A.- Oui.'0'

B.- Oui.EOF

C. - Oui.'\0'

D.C'est un espace.

CDispositions linguistiques:Par'\0' Étiquette de fin de chaîne valide

#include <stdio.h>
int main()
{
    char arr1[] = "abc";
    char arr2[] = { 'a', 'b', 'c' };
    char arr3[] = { 'a', 'b', 'c', '\0' };
    printf("%s\n", arr1);
    printf("%s\n", arr2);
    printf("%s\n", arr3);
    return 0;
}

 6,Caractère d'évasion

Caractère d'évasion Interprétation
\? Utilisé pour écrire plusieurs points d'interrogation consécutifs , Pour les empêcher d'être analysés en trois lettres
\' Utilisé pour représenter les constantes de caractère '
\\ Utilisé pour représenter une barre oblique inversée , Empêcher qu'il ne soit interprété comme un séquenceur d'évasion .
\ddd dddReprésentation1~3 Un nombre octal . Par exemple:: \130 X
\xdd ddReprésentation2Nombre hexadécimal. Par exemple:: \x30 0
\f Caractère d'alimentation
\n Nouvelle ligne
\r Retour à la voiture
\t Onglet horizontal
\v Onglet vertical
\" Guillemets doubles pour représenter l'intérieur d'une chaîne

  Ce n'est pas un caractère d'évasion ?

A.'\n'

B.'\060'

C.'\q'

D.'\b'

A:'\n' Caractère d'évasion, Au nom de la nouvelle ligne

B:'\060' Caractère d'évasion,060 Données octales ,Décimal as48,Donc,'\48'Ce qui signifie'0'

C:'\q' Rien n'est

D:'\b' Caractère d'évasion, Indique un backstage

7,strlen

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[] = {'b', 'i', 't'};
    printf("%d\n", strlen(arr));
	return 0;
}

strlenEst utilisé pour obtenir la longueur valide de la chaîne,Marque de fin'\0'Non inclus.

strlenLes règles sont très simples:Détection avant et arrière,Jusqu'à ce que'\0'Oui, mettre fin au test..

Et dans le haut du corps arrEst un tableau de caractères,N'est pas une chaîne valide,Parce qu'il n'y a pas de place derrière'\0',Donc,strlenLors de la résolution,Après avoir détecté les caractères valides,La détection en arrière se poursuit également,Jusqu'à ce que'\0'Oui, c'est terminé., La réponse est donc incertaine , Regarde juste après 't' Le premier après '\0'Dans quelle position.

#include <stdio.h>
#include <string.h>
int main()
{
    printf("%d\n", strlen("c:\test\121"))
    return 0;
}

strlen: Obtient la longueur valide de la chaîne ,Non compris'\0'

"c:\test\121": Dans cette chaîne ,\t C'est le caractère de transfert ,Tabulation horizontale,Passez au suivanttabEmplacement;Et\121Représente un caractère,Oui.121Regarde.8 Tableau décimal ,Convertir en10 Après décimal 81, Les devoirs sont ASCII Les caractères de la valeur du Code ,C'est - à - dire::Les caractères'Q' , Donc la chaîne ci - dessus est en fait :"c:  esty",Seulement7Caractères valides.

8,Création de tableaux

C Le tableau suivant dans la langue a été créé incorrectement :( )

A.int arr[10] = {0}

B.int n = 10; int arr[n] ={0}

C.int arr[] = {1,2,3,4,5,6,7,8,9,0}

D.char ch[10] = "hello bit"

Ce qui ne va pas avec la description du tableau est :

A.Un tableau est une collection d'éléments du même type

B.L'indice du tableau est de1Au début

C.L'indice du tableau est de0C'est parti.

D. Tableau si initialisé , Vous pouvez ne pas spécifier la taille du tableau

L'indice du tableau est de0Au début.

Il est important de noter queD:int a[] = {1,2,3}, Le tableau peut être dimensionné par initialisation .

9,Mots clés

Mots clés typedef:typedef Définition de type comme son nom l'indique , Ceci doit être interprété comme un renommage de type .

Mots clésstatic

1. Modifier les variables locales-Variable locale statique

2. Modifier les variables globales-Variables globales statiques

3. Modifier la fonction-Fonctions statiques

#include <stdio.h>
void test()
{
    //staticModifier les variables locales
    static int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
 int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}

static Modifier les variables locales modifie le cycle de vie des variables , Laisser la variable locale statique hors de portée existe toujours , À la fin du programme , Le cycle de vie est terminé .

static int g_val = 2018;
int main()
{
    printf("%d\n", g_val);
    return 0;
}

Une variable globale est staticModification, Rendre cette variable globale disponible uniquement dans ce fichier source , Impossible d'utiliser dans un autre fichier source .

static int Add(int x, int y)
{
    return c+y;
}
int main()
{
    printf("%d\n", Add(2, 3));
    return 0;
}

Une fonction est staticModification, De sorte que cette fonction ne puisse être utilisée que dans ce fichier source , Impossible d'utiliser dans un autre fichier source .

À propos deC Le mot - clé de la langue est correct :( )

A. Les mots - clés peuvent être créés par eux - mêmes

B. Les mots clés ne peuvent pas être créés par eux - mêmes

C. Les mots - clés peuvent être utilisés comme noms de variables

D.typedefCe n'est pas un mot - clé

À propos destatic Ce qui est faux, c'est que :( )

A.static Les variables locales peuvent être modifiées

B.static Les variables globales peuvent être réparées

C.static Les variables modifiées ne peuvent pas être modifiées

D.static Peut modifier la fonction

  staticModifier la variable

   a. Variables locales en fonction:

      Prolongation de la période de déclaration:La variable ne se termine pas avec la fin de la fonction

      Initialisation:Initialisation seulement la première fois que la fonction est appelée

      Mémoire:Lors d'un appel subséquent,Cette variable utilise la valeur enregistrée après la fin de l'appel de fonction précédent

      Lieu de stockage:Ne sera pas stocké sur la pile,Placer dans le segment de données

   b. Variables globales

     Modifier les propriétés du lien pour cette variable,Faire en sorte que la variable ait une portée de fichier,C'est - à - dire qu'il ne peut être utilisé que dans le fichier courant

   c. Lors de la modification des variables,Lorsqu'il n'est pas initialisé, il est automatiquement initialisé à0

staticModifier la fonction

Modifier les propriétés du lien pour cette fonction,Laisser cette fonction avoir une portée de fichier,C'est - à - dire qu'il ne peut être utilisé que dans le fichier courant

const Les variables modifiées ne peuvent pas être modifiées

#include <stdio.h>
int sum(int a)
{
    int c = 0;
    static int b = 3;
    c += 1;
    b += 2;
    return (a + b + c);
}
int main()
{
    int i;
    int a = 2;
    for (i = 0; i < 5; i++) 
    { 
        printf("%d,", sum(a)); 
    } 
} 

Cette question porte principalement sur static Modifier les propriétés des variables locales ,staticModifier les variables locales, La variable ne disparaît pas avec la fin de la fonction , Et l'initialisation n'est faite qu'au premier appel , Lorsque la fonction est appelée dans l'ordre suivant , Utilisez toutes les valeurs de la variable avant la dernière fin . 

  Premier cycle:a=2 b=5 c=1 a+b+c=8

  Deuxième cycle:a=2 b=7 c=1 a+b+c=10

  Deuxième cycle:a=2 b=9 c=1 a+b+c=12

  Deuxième cycle:a=2 b=11 c=1 a+b+c=14

  Deuxième cycle:a=2 b=13 c=1 a+b+c=16

10,Pointeur

Mémoire

La mémoire est particulièrement importante sur l'ordinateur ,Tous les programmes de l'ordinateur fonctionnent en mémoire . Donc pour une utilisation efficace de la mémoire , Diviser la mémoire en petites unités de mémoire , La taille de chaque Unit é mémoire est 1Octets. Pour un accès efficace à chaque Unit é de mémoire , L'Unit é mémoire est numérotée , Ces numéros sont appelés les adresses de l'unit é mémoire .

Les variables ont toutes des adresses, Les adresses des variables extraites sont les suivantes :

int main()
{
 int num = 10;
 &num;//Enlevez - le.numAdresse
 printf("%p\n", &num);//Imprimer l'adresse,%p--Imprimer sous forme d'adresse
 return 0;
}

Taille de la variable pointeur

#include <stdio.h>
int main()
{
    printf("%d\n", sizeof(char *));
    printf("%d\n", sizeof(short *));
    printf("%d\n", sizeof(int *));
    printf("%d\n", sizeof(double *));
    return 0;
}

 La taille du pointeur est32La plate - forme bit est4Octets,64La plate - forme bit est8Octets.

Ce qui est vrai à propos du pointeur, c'est que :( )

A.sizeof(char*) La taille doit être 1

B. Le pointeur est une variable ,Utilisé pour stocker l'adresse

C. La taille des variables du pointeur est 4Octets

D. Le pointeur n'est pas une variable

A:Erreur,Un pointeur est un type de données composé,Le contenu de la variable pointeur est une adresse,Ainsi, un pointeur peut représenter toute la collection d'adresses du système, Par conséquent,32Code de compilation de bits,Pointeur occupé4Octets,Selon64Code de compilation de bits,Pointeur occupé8Octets(Attention!:Non, pas du tout.64Le système bit doit occuper8Un mot  Section,La clé est de suivre64Compilation bitwise)

B:Exact.

C:Erreur,RÉFÉRENCESA Explication des options

D:Erreur, La description de cet article est assez vague   Un pointeur peut être considéré comme un type de données , Peut également être considéré comme une variable de pointeur définie

Trois, Déclarations de branche et de boucle

1,ifDéclarations

Structure grammaticale:
if(Expression)
    Déclarations;
if(Expression)
    Déclarations1;
else
    Déclarations2;
//Branches multiples    
if(Expression1)
    Déclarations1;
else if(Expression2)
    Déclarations2;
else
    Déclarations3;

Si les conditions sont réunies, Pour exécuter plusieurs déclarations , Comment utiliser un bloc de code .

#include <stdio.h>
int main()
{
    if(Expression)
   {
         Liste des déclarations 1;
   }
    else
   {
         Liste des déclarations 2;
   }
    return 0;
}

Le résultat de l'exécution du code suivant est :( )

#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 0; i<10; i++)
	{
		if (i = 5)
			printf("%d ", i);
	}
	return 0;
}

L'idée du code ci - dessus aurait dû être :Cycle10Une fois, À chaque cycle, si i==5Alors imprimeziLes résultats de.

Mais...if Expression dans l'instruction == Écrit comme une affectation , C'est l'équivalent d'essayer de i La valeur de est fixée à 5,5C'est vrai., Donc chaque fois qu'on imprime 5

i Chaque fois qu'il est modifié en 5Après impression,i La valeur de ne sera jamais égale à 10,Il en résulte un cycle mort

Donc...: Impression de boucles mortes 5

2,switchDéclarations

switch(Expression entière)
{
    Élément de déclaration;
}

  Bonne habitude de programmer

InswitchDans la Déclaration, Nous n'avons pas pu mettre directement en œuvre la branche ,Collocationbreak Utiliser pour réaliser une véritable branche

Au dernier case Après l'énoncé, ajouter un breakDéclarations. ( C'est écrit pour éviter d'apparaître dans les Ce dernier case J'ai oublié d'ajouter breakDéclarations).

 Dans chaque switch Il y en a un dans l'énoncé default La clause est une bonne habitude , On peut même ajouter un break .

int func(int a)
{
    int b;
    switch (a)
    {
        case 1: b = 30;
        case 2: b = 20;
        case 3: b = 16;
        default: b = 0;
    }
    return b;
}

Etfunc(1) = (      )

switchChaquecaseSi vous n'ajoutez pasbreakDéclarations,En courscaseAprès exécution,Continuera à suivrecaseDéclarations dans.func(1)C'est clair.,En appelantfuncParamètre temporelaLa valeur de1,switch(a)<==>switch(1),case 1Touché.,Parce queswitchAucune augmentation sous toutes les branches de l'instructionbreakDéclarations,Donc ça se passe de haut en bas.,Mise en œuvre finaledefaultRetour de l'instruction moyenne.Donc la réponse est0.

Quel est le résultat de l'exécution du code suivant ( )

#include <stdio.h>
int main() 
{
	int x = 3;
	int y = 3;
	switch (x % 2) 
{
	case 1:
		switch (y)
		{
		case 0:
			printf("first");
		case 1:
			printf("second");
			break;
		default: printf("hello");
		}
	case 2:
		printf("third");
	}
	return 0;
}
  #include <stdio.h>
  int main()
{
  	int x = 3;
  	int y = 3;
  	switch (x % 2) 
{  // x%2Le résultat de1,Mise en œuvrecase1
  	case 1:
  		switch (y)   // y- Oui.3, Donc il va exécuter case3,Etcase3N'existe pas, Ça ne peut être fait que default
  		{
  		case 0:
  			printf("first");
  		case 1:
  			printf("second");
  			break;
  		default: printf("hello"); // Imprimerhello, Après l'impression ,InterneswitchFin, À l'extérieur case1Fin
  		}             // Parce que l'extérieurcase1 Non ajouté après breakDéclarations,Alors Continuez.case2
  	case 2:             // Imprimerthird
  		printf("third");      // ExtérieurswitchFin
  	}
  	return 0;
  }

3,Déclaration circulaire

if(Conditions)
     Déclarations;
while(Expression)
 Déclaration circulaire;

whileDans une déclarationbreakEtcontinue

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

 breakInwhile Le rôle du cycle :

En fait, dans la boucle, il suffit de rencontrer break, Arrêtez tous les cycles ultérieurs , Fin directe du cycle . Alors...:whileDans break Est utilisé pour arrêter définitivement le cycle .

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

 continueInwhile Le rôle du cycle est :

continue Est utilisé pour mettre fin à ce cycle , C'est - à - dire dans ce cycle continue Le code suivant ne sera plus exécuté ,Mais directement. Passer àwhile La partie de jugement de l'énoncé .Effectuer un jugement d'entrée pour le prochain cycle.

#include <stdio.h>
int main()
{
	int a = 0, b = 0;
	for (a = 1, b = 1; a <= 100; a++)
	{
		if (b >= 20) break;
		if (b % 3 == 1)
		{
			b = b + 3;
			continue;
		}
		b = b-5;
	}
	printf("%d\n", a);
	return 0;
}

 Premier cycle:a = 1,b=1--->bMoins de20,ifC'est faux.,b%3==1%3==1Fondé,b=b+3, En ce momentbLa valeur de4

 Premier cycle:a = 2,b=4--->bMoins de20,ifC'est faux.,b%3==4%3==1Fondé,b=b+3, En ce momentbLa valeur de7

 Premier cycle:a = 3,b=7--->bMoins de20,ifC'est faux.,b%3==7%3==1Fondé,b=b+3, En ce momentbLa valeur de10

 Premier cycle:a = 4,b=10--->bMoins de20,ifC'est faux.,b%3==10%3==1Fondé,b=b+3, En ce momentbLa valeur de13

 Premier cycle:a = 5,b=13--->bMoins de20,ifC'est faux.,b%3==13%3==1Fondé,b=b+3, En ce momentbLa valeur de16

 Premier cycle:a = 6,b=16--->bMoins de20,ifC'est faux.,b%3==16%3==1Fondé,b=b+3, En ce momentbLa valeur de19

 Premier cycle:a = 7,b=19--->bMoins de20,ifC'est faux.,b%3==19%3==1Fondé,b=b+3, En ce momentbLa valeur de22

 Premier cycle:a = 8,b=22--->bPlus grand que20,ifFondé,CyclebreakPrésentation

Impression finalea:8

 Quatre,Fonctions

1,Fonctions de bibliothèque

Nous savons que dans nos études CQuand la langue est programmée,Toujours impatient de connaître les résultats après qu'un code ait été écrit,Oui. Imprimez ce résultat sur notre écran pour voir .À cette époque, nous utilisons souvent une fonction: Placez l'information dans un certain nombre de cases Imprimer à l'écran (printf).

Nous faisons souvent des copies de chaînes pendant la programmation (strcpy).

Dans la programmation, nous calculons aussi,Toujours calculernDekUne opération comme la puissance(pow).

2,Fonction personnalisée

Composition de la fonction:

ret_type fun_name(para1, * )
{
 statement;//Élément de déclaration
}
ret_type Type de retour
fun_name Nom de la fonction
para1    Paramètre de fonction
#include <stdio.h>
//get_maxConception de la fonction
int get_max(int x, int y)
{
 return (x>y)?(x):(y);
}
int main()
{
 int num1 = 10;
 int num2 = 20;
 int max = get_max(num1, num2);
 printf("max = %d\n", max);
 return 0;
}

La Déclaration et la définition de la fonction sont correctes :( )

A. La définition d'une fonction doit précéder son utilisation

B. La fonction doit s'assurer qu'elle est déclarée avant d'utiliser

C. Définition de la fonction après utilisation , Ou ne pas déclarer

D. La Déclaration d'une fonction indique comment la fonction est implémentée

A:Erreur, La définition de la fonction peut être placée n'importe où , La Déclaration de la fonction doit précéder l'utilisation de la fonction

B:Exact.

C:Erreur, Définition de la fonction après utilisation , Lorsqu'aucune déclaration n'a été faite avant utilisation , La fonction n'est pas reconnue par le compilateur au moment de la compilation

D:Erreur, La Déclaration de la fonction indique simplement au compilateur le type de valeur de retour de la fonction 、 Nom de la fonction et paramètres requis par la fonction , C'est la définition de la fonction qui explique comment la fonction est   Réalisé

3,Appel de fonction

Appel de valeur

Les arguments formels et réels de la fonction occupent différents blocs de mémoire respectivement,Les modifications apportées aux paramètres n'affectent pas les arguments.

Appel d'adresse

Un appel d'adresse est un moyen d'appeler une fonction en passant l'adresse mémoire d'une variable créée à l'extérieur de la fonction à un paramètre de fonction. Cette façon de passer les paramètres permet à la fonction d'établir une relation positive et réelle avec les variables à l'extérieur de la fonction, C'est - à - dire que la fonction peut fonctionner directement à l'intérieur Comme variable en dehors de la fonction .

Peut renvoyer deux données du résultat du traitement de la fonction à la fonction d'appel , Ce qui n'est pas correct dans la méthode ci - dessous est :( )

A.return Ces deux chiffres

B. Tableau des paramètres formels

C. Le paramètre formel utilise deux pointeurs

D. Avec deux variables globales

A:Erreur, Une fonction ne peut renvoyer qu'un seul résultat

B:Exact., Pour mettre un paramètre formel dans un tableau , Modifier le contenu du tableau , Les résultats des modifications peuvent être retirés du tableau

C:Exact., Si vous utilisez un pointeur , Le point final est l'argument externe , Modifier le pointeur dans la fonction , Ce qui change, c'est l'argument externe

D:Exact., Les variables globales ne se terminent pas par la fin d'une fonction , Modifier les variables globales en fonction , Le résultat après le changement peut être vu dans la fonction d'accent

Ce qui est incorrect à propos de l'appel de fonction est :( )

A. La fonction peut être appelée par valeur , Le paramètre est une copie temporaire de l'argument lorsqu'il est appelé par la valeur

B. La fonction peut être appelée , Quand l'adresse appelle , Les arguments peuvent être manipulés par des arguments formels

C. Les fonctions peuvent être imbriquées avec des définitions , Mais les appels ne peuvent pas être imbriqués

D.Les fonctions peuvent être imbriquées,Mais les définitions ne peuvent pas être imbriquées

 A:Exact., Les paramètres formels sont transmis par valeur , Le futur paramètre est une copie temporaire de l'argument , Modifier un paramètre n'affecte pas les arguments externes

B:Exact., Les paramètres formels sont transmis par pointeur , Le futur paramètre est une copie de l'adresse du paramètre , Le paramètre indique l'argument , Modifier ce que le pointeur de paramètre pointe ,   C'est en manipulant les arguments

C:Erreur,CDans la langue, La fonction ne peut pas imbriquer la définition

D:Exact.,Les fonctions peuvent être imbriquées,C'est - à - dire::A()Appel moyenB(),B()Appel moyenA(), Mais pour bien contrôler , Sinon, c'est une récursion infinie

Quand une fonction est appelée,Ce qui suit est vrai::( )

A. L'appel de fonction doit rapporter la valeur de retour

B. Les paramètres réels et formels peuvent avoir le même nom

C. Les variables globales ne peuvent pas être utilisées pour le transfert de données entre les fonctions

D. La fonction d'appel et la fonction d'appel sont toujours dans le même fichier

 4,Paramètres de la fonction

Paramètres réels(Arguments réels)

Paramètres réels transmis à la fonction,Appelé argument.Les arguments peuvent être:Constante、Variables、Expression、Fonctions, etc. Quel que soit le type d'argument La quantité de type ,Lors d'un appel de fonction,Ils doivent tous avoir une valeur certaine,Pour transmettre ces valeurs aux paramètres formels.

Paramètres de forme(Ginseng):

Un paramètre formel est une variable entre parenthèses après le nom de la fonction,Parce que les arguments formels ne sont instantanés que lorsque la fonction est appelée(Répartition Unit é mémoire),Donc ça s'appelle un paramètre formel.Le paramètre de forme est automatiquement détruit lorsque l'appel de fonction est terminé. Le paramètre de forme n'est donc disponible qu'à Valide en fonction .

Ce qui est mal décrit à propos des arguments et des arguments est :( )

A.Un paramètre est une copie temporaire d'un argument

B.Les arguments formels ne sont instantanés que lorsque la fonction est appelée,Pour ouvrir la mémoire

C. Changer un paramètre est changer un argument

D. Appel de fonction si l'appel de valeur est utilisé , Le changement de paramètre n'affecte pas l'argument

A:Exact., Lors du transfert d'un paramètre, que ce soit par valeur ou par pointeur , Tout ce que le paramètre obtient est une copie de l'argument

B:Exact., Quand la fonction n'est pas appelée , Il n'y a pas de place pour les nouveaux paramètres

C:Erreur, Si elle est passée par valeur , Les arguments et les arguments ont chacun leur propre espace , Changer un paramètre de forme ne change pas l'argument externe

D:Exact., Parce que les arguments et les arguments sont deux variables différentes

Appel de fonctionexec((vl,v2),(v3,v4),v5,v6);Moyenne,Le nombre d'arguments est:( )

 exec((vl,v2),(v3,v4),v5,v6) Il y a quatre paramètres au total

 (v1, v2)Appartient au premier argument,Expression virgule,Quand les paramètres réels sontv2

 (v3,v4)Appartient au deuxième argument,Expression virgule,Le vrai paramètre estv4

 v5Appartient au troisième argument

 v6Appartient au quatrième argument

Cinq,Tableau

1, Création et initialisation de tableaux unidimensionnels .

type_t   arr_name   [const_n];
//type_t Est le type d'élément du Groupe exponentiel
//const_n Est une expression constante,Utilisé pour spécifier la taille du tableau

Une dimension est définie int Tableau type a[10] Après,La référence incorrecte suivante est:( )

A.a[0] = 1;

B.a[0] = 5*2;

C.a[10] = 2;

D.a[1] = a[2] * a[0];

Un tableau est un espace continu du même type,L'indice est de0Au début,Par exemple,:int array[N]

La gamme d'indices est[0,N),Parmi euxNL'emplacement ne peut pas stocker d'éléments valides

A:Exact.,Oui.0 La position du numéro est réglée à 1

B:Exact.,Oui.0 La position du numéro est réglée à 10

C:Erreur,Hors de portée

D:Exact.,1 La position no est initialisée à a[2]*a[0]Résultats ultérieurs

2,Utilisation de tableaux unidimensionnels

#include <stdio.h>
int main()
{
    int arr[10] = { 0 };// Initialisation incomplète du tableau 
       //Calculer le nombre d'éléments du tableau
    int sz = sizeof(arr) / sizeof(arr[0]);
    //Assigner une valeur au contenu du tableau,Le tableau est accessible à l'aide d'un indice,Indice de0C'est parti..Alors...:
    int i = 0;//Faire un indice
    for (i = 0; i < 10; i++)//Écris ici.10,D'accord, d'accord.?
    {
        arr[i] = i;
    }
    //Afficher le contenu du tableau
    for (i = 0; i < 10; ++i)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

Le résultat du code suivant est :( )

#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};
    printf("%d\n", sizeof(arr));
    return 0;
}

Pourint arr[] = {1,2,(3,4),5}Tableau, Il y a au total 4Éléments,(3,4) Pour l'expression virgule , Prends ce dernier , Les éléments du tableau sont donc :1,2,4,5.Etsizeof(arr) Ce que vous voulez, c'est la taille de l'espace que le tableau entier prend ,C'est - à - dire::4*sizeof(int)=4*4=16

Le résultat du code suivant est :( )

#include <stdio.h>
int main()
{
    char str[] = "hello bit";
    printf("%d %d\n", sizeof(str), strlen(str));
	return 0;
}

strTableau de caractères utilisant"hello bit"Initialisation,Et finalement'\0'Placer dans un tableau,Il y a donc un total de10Éléments

sizeof(str):Obtient la taille totale du tableau,10Éléments,Par élément1Octets,Donc au total10Octets

strlen(str): Obtient le nombre de caractères valides dans la chaîne,Pas vraiment.'\0',Donc au total9Caractères valides

Donc ce qui précèdeprintfImprimera séparément:10  9

Une description incorrecte d'un tableau unidimensionnel est :( )

A.L'indice du tableau est de0Au début

B.Les tableaux sont stockés en mémoire en continu

C.Le nom du tableau indique l'adresse du premier élément

D. Avec un indice de tableau de petit à grand , Adresse de haut en bas

A:Exact.,CDispositions linguistiques,L'indice du tableau est de0Au début

B:Exact., L'espace du tableau est un espace mémoire continu

C:Exact., Le nom du tableau peut représenter l'adresse du tableau , Peut également représenter l'adresse de l'élément d'en - tête du tableau , Les deux sont identiques numériquement , Mais le sens est différent .

  Attention!: Le nom du tableau n'est disponible que si sizeofEt& Pour représenter le tableau entier , Tout le reste représente l'adresse du premier élément

D:Erreur, Si ça dépend du système , En général, les indices vont de petits à grands , Adresse de bas en haut

3,Initialisation du tableau 2D

Création de tableaux 2D

//Création de tableaux
int arr[3][4];
char arr[3][5];
double arr[2][4];

Initialisation du tableau 2D

//Initialisation du tableau
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {
   {1,2},{4,5}};
int arr[][4] = {
   {2,3},{4,5}};

Voici un tableau bidimensionnel a L'instruction correctement initialisée est :( )

A.int a[2][]={ {0,1,2},{3,4,5}};

B.int a[][3]={ {0,1,2},{3,4,5}};

C.int a[2][4]={ {0,1,2},{3,4},{5}};

D.int a[][3]={ {0,,2},{},{3,4,5}};

Pour un tableau 2Dint array[M][N], La description est la suivante::

 1. MEtNDoit être constant,

 2. MLe tableau représentatif aMD'accord,NReprésente chaque ligne avecNÉléments

 3. Parmi euxMPeut être omis,L'expression d'initialisation doit être donnée après l'omission,Le compilateur déduit du résultat d'initialisation combien de lignes le tableau a

 4. NIl ne faut pas omettre,Parce queNL'omission ne permet pas de déterminer le nombre d'éléments d'une ligne,On ne sait pas non plus combien de lignes il y a dans le tableau

A:Erreur, Paramètre description ci - dessus

B:Exact., Voir les instructions ci - dessus

C:Erreur, Le tableau a deux lignes , Mais l'initialisation a donné trois lignes

D:Erreur, Initialisation non autorisée {0,,2} Cette situation existe

Six,Opérateur

1,Opérateur arithmétique

+    -   *   /   %

1. Sauf que % En dehors de l'opérateur,Plusieurs autres opérateurs peuvent agir sur des entiers et des points flottants.

2. Pour / Opérateur si les deux opérandes sont des entiers,Effectuer une division intégrale.Et tant qu'il y a un nombre flottant, il y a une division flottante. Droit.

3. % Les deux opérandes de l'opérateur doivent être des entiers.Renvoie le reste après la division entière.

2,Déplacer l'opérateur

<< Déplacer l'opérateur à gauche
>> Déplacer l'opérateur à droite

Déplacer l'opérateur à gauche Règle de déplacement:

Abandonné à gauche、À droite.0

Déplacer l'opérateur à droite Règle de déplacement:

1. Déplacement logique À gauche0Remplissage,Jeter à droite

2. Déplacement arithmétique Remplissez la gauche avec le BIT de symbole de la valeur originale,Jeter à droite

3,Opérateur de bits

& //Bitwise vs.
| //Bitwise or
^ //Xor bitwise
Note::Leurs opérandes doivent être des entiers
#include <stdio.h>
int main()
{
 int num1 = 1;
 int num2 = 2;
 num1 & num2;
 num1 | num2;
 num1 ^ num2;
 return 0;
}

4,Opérateur monoculaire

!           Opération inverse logique
-           Valeur négative
+           Positif
&           Prenez l'adresse.
sizeof      Longueur de type de l'opérande(En octets)
~           Inverse un nombre de bits binaires
--          Avant、Postposition--
++          Avant、Postposition++
*           Opérateur d'accès indirect(Opérateur non référencé)
(Type)       Forcer la conversion de type

Les quatre éléments ci - dessus ont été expliqués dans mon blog précédent , Bienvenue à l'archéologie .

5,sizeofEt tableaux

#include <stdio.h>
 int main()
 {
 int a = 10;
 int x = ++a;
 //D'abord.aEffectuer l'auto - augmentation,Et pour l'utilisationa,C'est - à - dire que la valeur de l'expression estaValeur depuis l'augmentation.xPour11.
 int y = --a;
 //D'abord.aEffectuer une auto - soustraction,Et pour l'utilisationa,C'est - à - dire que la valeur de l'expression estaValeur après soustraction.yPour10;
 return 0;
 }
 
 //Postposition++Et--
 #include <stdio.h>
 int main()
 {
 int a = 10;
 int x = a++;
 //D'abord.aUtilisez d'abord,Plus de,Voilà.xLa valeur de10;AprèsaDevenir11;
 int y = a--;
 //D'abord.aUtilisez d'abord,Encore moins,Voilà.yLa valeur de11;AprèsaDevenir10;
 return 0;
 }
#include <stdio.h>
int main()
{
	int a, b, c;
	a = 5;
	c = ++a;
	b = ++c, c++, ++a, a++;
	b += a++ + c;
	printf("a = %d b = %d c = %d\n:", a, b, c);
	return 0;
}
#include <stdio.h>
int main()
{
	int a, b, c;
	a = 5;
	c = ++a;// ++a:Plus.a+1,Les résultats sont les suivants:6,Après l'addition, les résultats sont les suivants:cAffectation,Donc,:a = 6  c = 6
	b = ++c, c++, ++a, a++;
   //  Priorité de l'expression virgule ,Minimum, Ça commence par b=++c, bCe qu'on a, c'est++cAprès les résultats,b- Oui.7
   // b=++c  Et l'expression de la virgule derrière , Calculé de gauche à droite .
   // À la fin de l'expression,c++Et,++a,a++Oui.a+2,Voilà.cPlus1,En ce momentc:8,a:8,b:7
	b += a++ + c; // aD'abord.cPlus,Les résultats sont les suivants:16,AjouterbValeur de7,Le résultat du rapport est23,EnfinaPlus1,aLa valeur de9
	printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8
	return 0;
}

6,Expression virgule

exp1, exp2, exp3, …expN

Expression virgule,Sont des expressions séparées par des virgules. Expression virgule,Exécuter de gauche à droite. Le résultat de toute l'expression est le plus Le résultat de cette dernière expression .

int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);
	printf("%d", c);
	return 0;
}

Sept,Pointeur

1,Qu'est - ce qu'un pointeur?

En informatique,Pointeur(Pointer)Est un objet dans un langage de programmation,Utiliser l'adresse,Sa valeur pointe directement vers (points to)Il y a une valeur à un autre endroit dans la mémoire de l'ordinateur.Parce que l'unit é variable requise peut être trouvée par l'adresse,C'est bon. Dis - le.,L'adresse indique l'unit é variable.Donc,,La visualisation de l'adresse s'appelle“Pointeur”.Cela signifie qu'il peut trouver l'unit é mémoire qui l'adresse.

Le pointeur est une variable ,Adresse de stockage de l'unit é mémoire(No.).

#include <stdio.h>
int main()
{
 int a = 10;//Créer un espace en mémoire
 int *p = &a;//Ici, nous avons des variablesa,Prenez son adresse,Peut être utilisé&Opérateur.
   //Oui.aL'adresse depDans la variable,pEst une variable pointeur.
 return 0;
}

À propos du concept de pointeur ,L'erreur est:( )

A. Le pointeur est une variable ,Utilisé pour stocker l'adresse

B. L'adresse valide stockée dans la variable pointeur peut pointer uniquement vers une zone de mémoire

C. Le pointeur de champ peut également être utilisé correctement

D. Une variable de pointeur local qui n'est pas initialisée est un pointeur sauvage

A:Exact., Une adresse est stockée dans la variable pointeur , Pointez vers le même type d'espace mémoire

B:Exact.,L'adresse est unique, Une seule adresse peut être stockée dans une variable pointeur , Il est donc possible de pointer uniquement vers une zone en mémoire

C: Illégal lorsque le pointeur sauvage pointe vers l'espace , Ou l'espace que le pointeur pointe n'existe plus , Le pointeur sauvage ne peut donc pas être utilisé

D: Les variables de pointeur locales sont des valeurs aléatoires lorsqu'elles ne sont pas initialisées , Donc pointer vers cette position n'est pas nécessairement , Il est donc considéré comme un pointeur sauvage

Dans les systèmes suivants,intLe type prend plusieurs octets,Le pointeur prend plusieurs octets,Combien d'espace mémoire maximum le système d'exploitation peut utiliser:( )

A.32Sous - position:4,4,2^32 64Sous - position:8,8,2^64

B.32Sous - position:4,4,Aucune restriction 64Sous - position:4,8,Aucune restriction

C.32Sous - position:4,4,2^32 64Sous - position:4,8,2^64

D.32Sous - position:4,4,2^32 64Sous - position:4,4,2^64

32Système de bits inférieur:

intPourcentage4Octets,Le pointeur indique le nombre d'espaces d'adresse,En tout.2^32- Oui.,Par conséquent,4Octets

64Système de bits inférieur:

intPourcentage4Octets,Le pointeur indique le nombre d'espaces d'adresse,En tout.2^64- Oui.,Par conséquent,8Octets

La taille du pointeur est32La plate - forme bit est4Octets,In64La plate - forme bit est8Octets.

2,Dénouement du pointeur

int main()
{
 int n = 0x11223344;
 char *pc = (char *)&n;
 int *pi = &n;
 *pc = 0;   //L'accent est mis sur l'observation des changements de mémoire pendant le débogage.
 *pi = 0;   //L'accent est mis sur l'observation des changements de mémoire pendant le débogage.
 return 0;
}

Résumé: Le type de pointeur détermine,Quelles sont les permissions de désactiver le pointeur(Peut fonctionner sur plusieurs octets). Par exemple,: char* De Le pointeur ne peut accéder qu'à un octet sans référence,Et int* Le pointeur pour accéder à quatre octets sans référence.

Le résultat du code suivant est :( )

#include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5};
  short *p = (short*)arr;
  int i = 0;
  for(i=0; i<4; i++)
  {
    *(p+i) = 0;
  }
   
  for(i=0; i<5; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}
arrLe format de stockage du tableau en mémoire est:
0x00ECFBF4:  01 00 00 00
0x00ECFBF8:  02 00 00 00
0x00ECFBFC:  03 00 00 00
0x00ECFC00:  04 00 00 00
0x00ECFC04:  05 00 00 00
PointeurpLe type deshort*Type,Donc,pSeulement les deux octets à la fois,forLorsque le contenu d'un tableau est modifié en boucle,Une visite:
arr[0]Les deux octets inférieurs de,arr[0]Deux octets de haut pour,arr[1]Les deux octets inférieurs de,arr[1]Deux octets de haut pour,Donc après le changement,,Le contenu du tableau est le suivant::
0x00ECFBF4:  00 00 00 00
0x00ECFBF8:  00 00 00 00
0x00ECFBFC:  03 00 00 00
0x00ECFC00:  04 00 00 00
0x00ECFC04:  05 00 00 00
Impression finale:0   0   3   4   5

Le résultat de la sortie de code suivante est:( )

#include <stdio.h>
int main()
{
	int a = 0x11223344;
    char *pc = (char*)&a;
    *pc = 0;
    printf("%x\n", a);
    return 0;
}
Analyse des réponses:
 
Hypothèses,aL'adresse de la variable est0x64,EtaLe modèle de la variable en mémoire est:
0x64| 44 |
0x65| 33 |
0x66| 22 |
0x67| 11 |
 
char*Variable pointeur de typepcPointer vers un espace qui ne peut pointer que vers un type de caractère,Si oui noncharEspace de type,Vous devez forcer l'adresse de l'espace àchar*Type.
char *pc = (char*)&a; pcCe qui est réellement pointé est une variable de formeaDe l'espace,C'est - à - dire:pcLe contenu de0x64,C'est - à - dire:44,
*pc=0,Bientôt44Lire comme suit:0,Après modification,aLe contenu est le suivant::0x11223300

版权声明
本文为[- Non.]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/10/20211013211336206l.html

随机推荐