Maison  >  Article  >  développement back-end  >  Quels sont les usages des pointeurs en langage C ?

Quels sont les usages des pointeurs en langage C ?

coldplay.xixi
coldplay.xixioriginal
2020-11-02 09:12:5517999parcourir

Utilisation du pointeur en langage C : 1. La valeur par défaut des variables de pointeur est incertaine comme les variables ordinaires et est généralement initialisée à NULL 2. L'utilisation des variables de pointeur est différente des variables ordinaires et se distingue généralement par se terminant par p; 3. Pointeurs Le type de variable détermine le nombre d'octets accédés lors de l'accès à la mémoire via une variable de pointeur.

Quels sont les usages des pointeurs en langage C ?

Utilisation du pointeur en langage C :

1. Définition du pointeur :

La plage de valeurs des variables de pointeur est 0~4G, qui est un type de données (entier non signé, représentant le numéro de mémoire). Il peut être utilisé pour définir des variables (identiques à int et long). Différent de int et long, il stocke un entier qui représente le numéro de mémoire. Grâce à cette variable, on peut accéder à la mémoire avec le numéro correspondant.

2. Le rôle des pointeurs

1. La mémoire tas ne peut pas être nommée (les identifiants ne peuvent pas être utilisés pour établir un contact avec la mémoire tas), et des pointeurs doivent être utilisés.

2. Les paramètres entre les fonctions sont transférés par valeur (copie de mémoire). L'utilisation de pointeurs peut optimiser l'efficacité du transfert de paramètres (les variables doivent être protégées). Étant donné que le langage C utilise le transfert de valeurs (copie de mémoire), l'efficacité opérationnelle diminuera à mesure que le nombre d'octets variables augmente, et l'adresse de la variable transférée ne copiera toujours que 4 ou 8 octets.

void func(const int* p);Mais la valeur d'une variable pointeur peut être modifiée et peut être utilisée avec const.

3. Les fonctions sont indépendantes les unes des autres. Parfois, la collaboration nécessite des variables partagées (trop de variables globales provoqueront des conflits de noms et ne seront pas libérées pour gaspiller de la mémoire. Le partage peut être réalisé en passant l'adresse des variables entre). fonctions. L’effet des variables.

3. Utilisation des pointeurs :

Définition : 类型* 变量名_p;

1. Les variables de pointeur sont les mêmes que les variables ordinaires. incertain et est généralement initialisé est NULL.

2. L'utilisation des variables de pointeur est différente des variables ordinaires, et elles se distinguent généralement par leur terminaison par p.

3. Le type de variable de pointeur détermine le nombre d'octets accessibles lors de l'accès à la mémoire via la variable de pointeur.

4. Les variables de pointeur ne peuvent pas être définies en continu (un * ne peut définir qu'une seule variable de pointeur) :

  int* p1,p2; // p est un pointeur, p2 est une variable de type int

  int *p1,*p2; // p1 et p2 sont tous deux des variables de pointeur

Affectation : variable de pointeur = numéro de mémoire. Nom de la variable_p = adresse ;

Le numéro de mémoire doit être accessible. Si le numéro est erroné, cela peut provoquer une erreur de segmentation. void* peut être automatiquement converti en n’importe quel type de pointeur (pas en C++). Assurez-vous que l'adresse correspond à la mémoire physique (mappée), sinon il y aura une erreur de segmentation.

 int* p = malloc(4);
 int* p = # // 引用内存

Accès : *Variable pointeur //Déréférence----Variable pointeur d'accès

Accédez à la mémoire correspondante en fonction du numéro de mémoire stocké dans la variable pointeur. Si le numéro de mémoire attribué précédemment est incorrect, une erreur de segmentation se produira à cette étape. Les octets accessibles sont déterminés par le type de pointeur. int* p = #                                        Fondamentalement,

peut être utilisé, mais toutes les opérations n'ont pas de sens.

Pointeur + entier = pointeur + largeur * entier

Pointeur - entier = pointeur - largeur * entier // Le pointeur avance et recule

Pointeur - pointeur = (pointeur - pointeur )/width// Combien d'éléments sont séparés entre deux pointeurs

Pointeur>, 91eef5681cad6f0cc96f9adeb2931b45= Le pointeur peut déterminer qui est devant et qui est derrière.

6. Tableaux et pointeurs

. Le nom du tableau est une adresse spéciale et peut également être utilisé comme pointeur. Le nom du tableau est une constante (le nom du tableau correspond à la première adresse de. le premier élément du tableau), les pointeurs ordinaires pointent vers les relations). Le nom du tableau peut utiliser le déréférencement du pointeur, et la variable du pointeur peut également utiliser le [];arr[i] 96b4fef55684b9312718d5de63fb7121 Lorsqu'un tableau est utilisé comme paramètre de fonction, il devient une variable de pointeur. La longueur est perdue et la sécurité devient plus petite. void func(int * const arr,size_t len);

7, Utilisation avancée des pointeurs.

Pointeur de tableau et tableau de pointeurs :

(1) Pointeur de tableau (pointeur) : un pointeur spécialement utilisé pour pointer vers un tableau.

int arr[10];
int (*p)[10] = arr;
int* p = #

//Tableau bidimensionnel Le transfert des paramètres de fonction utilise un pointeur de tableau

(2) Tableau de pointeurs (array) : Le type de données stocké dans un tableau est un pointeur.

résumer ensemble les données discrètes et désordonnées. void func(int I,int J,int(*arr)[J]) 

(3). Pointeur de valeur secondaire : pointeur vers le pointeur

4. Pointeur de fonction : pointeur vers la fonction (ne peut pas être déréférencé)int* arr[3]; 96b4fef55684b9312718d5de63fb7121 int *p1,*p2,*p3;9, pointeur const

//Les données dans la mémoire pointées par le pointeur ne peuvent pas être modifiées par déréférence

(1) Paramètres des fonctions protégées

(2) Lorsque le pointeur pointe vers des données en lecture seule, const doit également être ajouté pour éviter les erreurs de segmentation.

 const int * p;

// Idem que ci-dessus

// La valeur de la variable pointeur ne peut pas être modifiée

 可以防止指针变量意外变成野指针

    const int* const p; // 既保存指针所指针的内存,也保护指针变量

    int const * const p; // 同上

运行:

*p_num=10
请输入一个数字:1
*p_num是1
*ptr=10

10,注意事项:

空指针:

  • 变量指针的值等于NULL,这种指针叫空指针。

  • 不能对空指针解引用,一定会出现段错误。

  • 当操作重启时会跳转NULL地址,进行重启,因此NULL存储操作系统用于重启的数据。

  • NULL在C语言中是一种错误标志,如果函数的返回值是指针类型,

  • 结果一旦NULL表示函数执行出错或失败。

如何避免空指针造成的段错误?

使用来历不明(函数的参数)的指针前先进行检查,if(NULL == p)。

野指针:指针变量的值不确定,使用野指针不一定会出错。

int* p; // 野指针

使用野指针的后果:段错误。

注意:野指针是无法分辨的,所以比空指针危害更。

如何避免野指针造成的错误?

  • 所有的野指针都人制造出来的,只要人人都不制造野指针就会有野指针造成的错误。

  • 定义指针变量时一定要初始化。

  • 指针变量所指向的内存初始释放后要及时赋值为空(堆内存)。

  • 不返回局部变量的地址。

相关学习推荐:C视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn