Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind die Verwendungszwecke von Zeigern in der C-Sprache?

Was sind die Verwendungszwecke von Zeigern in der C-Sprache?

coldplay.xixi
coldplay.xixiOriginal
2020-11-02 09:12:5517996Durchsuche

C-Sprachzeigerverwendung: 1. Der Standardwert von Zeigervariablen ist wie bei gewöhnlichen Variablen unsicher und wird im Allgemeinen auf NULL initialisiert. 2. Die Verwendung von Zeigervariablen unterscheidet sich von gewöhnlichen Variablen und wird im Allgemeinen dadurch unterschieden, dass sie mit p endet. 3. Der Typ der Zeigervariablen wird bestimmt. Auf wie viele Bytes wird zugegriffen, wenn über eine Zeigervariable auf den Speicher zugegriffen wird.

Was sind die Verwendungszwecke von Zeigern in der C-Sprache?

C-Sprachzeigerverwendung:

1. Zeigerdefinition:

Der Wertebereich der Zeigervariablen liegt zwischen 0 und 4G, einem Datentyp (vorzeichenlose Ganzzahl, die die Speichernummer darstellt). Es kann zum Definieren von Variablen verwendet werden (dasselbe wie int und long). Über diese Variable kann auf den Speicher mit der entsprechenden Nummer zugegriffen werden.

Zweitens die Rolle von Zeigern

1. Der Heap-Speicher kann nicht benannt werden (Bezeichner können nicht zum Herstellen eines Kontakts mit dem Heap-Speicher verwendet werden), und es müssen Zeiger verwendet werden.

2. Parameter zwischen Funktionen werden nach Wert übertragen (Speicherkopie) kann die Effizienz der Parameterübertragung optimieren (Variablen müssen geschützt werden). Da die C-Sprache die Wertübertragung (Speicherkopie) verwendet, nimmt die Betriebseffizienz mit zunehmender Anzahl der Variablenbytes ab und die Adresse der übertragenen Variablen kopiert immer nur 4 oder 8 Bytes.

void func(const int* p);Der Wert der Zeigervariablen kann jedoch geändert werden, sodass er mit const verwendet werden kann. void func(const int* p);但使用指针变量的值可能会被修改,可以配合const。  

3、函数之间是相互独立的,有时协同配合需要共享变量(全局变量过多会造成命名冲突,不会被释放浪费内存),函数之间传递变量的地址可以达到共享变量的效果。

三,指针的用法:

定义:类型* 变量名_p;  

 1、指针变量与普通变量一样默认值不确定,一般初始化为NULL。

 2、指针变量的用法与普通变量不同,一般以p结尾加以区分。

 3、指针变量的类型决定了通过指针变量访问内存时访问几个字节。

 4、指针变量不能连续定义(一个*只能定义出一个指针变量):

  int* p1,p2; // p是指针,p2是int类型变量

  int *p1,*p2; // p1和p2都是指针变量

赋值:指针变量 = 内存编号。   变量名_p = 地址;

    内存编号要能够访问,如果编号错误可能会造成段错误。void*可以与任意类型指针进行自动转换(C++中不行)。要保障地址与物理内存有对应关系(映射过),否则有段错误。

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

访问:*指针变量 //解引用----访问指针变量

 根据指针变量中存储的内存编号去访问对应的内存。如果之前赋值的内存编号有误,这个步骤会出现段错误。访问的字节由指针类型决定。     int* p = #                   *p 96b4fef55684b9312718d5de63fb7121 num;

5,指针运算

指针变量中存储的就是整数,因此为整型数据能使用的运算符指针变量基本都能使用

,但不是所有运算都有意义。

指针+整数 = 指针+宽度*整数

指针-整数 = 指针-宽度*整数 // 指针进行前后移动

指针-指针 = (指针-指针)/宽度 // 两个指针之间相隔多少个元素

指针 >、d2714fbb0e49a95306c2048bc19e4f2b= 指针 可以判断两个谁在前谁在后。

6,数组与指针

 .数组名就是个特殊的地址,也能当指针使用,数组名是个常量(数组名与数组第一个元素的首地址是对应关系,普通指针是指向关系)。数组名可以使用指针的解引用,而指针变量也可以使用数组的[];arr[i] 96b4fef55684b9312718d5de63fb7121 *(arr+i)。数组当函数的参数就脱变成了指针变量,长度丢失,安全性也变小void func(int * const arr,size_t len);

7,指针的高级使用

数组指针与指针数组:

(1).数组指针(指针):专门用来指向数组的指针。

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

void func(int I,int J,int(*arr)[J])  //二维数组 函数传参使用数组指针

(2).指针数组(数组):一个数组里存储的数据类型是指针。

                把无序的离散数据,归纳到一起。

int* arr[3]; 96b4fef55684b9312718d5de63fb7121 int *p1,*p2,*p3;

(3).二级值针: 指向指针的指针

4.函数指针: 指向函数的指针(不能解引用)

9,const 指针

 const int * p; // 不能通过解引用去修改指针所指向的内存的数据

 (1)保护函数的参数

 (2)当指针指向的是只读数据,也应该加上const防止出现段错误。

   int const * p; // 同上

   int* const p;

3. Funktionen sind unabhängig voneinander. Manchmal sind für die Koordination gemeinsame Variablen erforderlich (zu viele globale Variablen führen zu Namenskonflikten und werden nicht freigegeben, um Speicher zu verschwenden). 🎜🎜🎜3. Verwendung von Zeigern: 🎜🎜🎜Definition: Typ* Variablenname_p; 🎜🎜 1. Zeigervariablen haben den gleichen Standardwert wie gewöhnliche Variablen und werden im Allgemeinen auf NULL initialisiert. 🎜🎜 2. Die Verwendung von Zeigervariablen unterscheidet sich von gewöhnlichen Variablen und unterscheidet sich normalerweise dadurch, dass sie mit p enden. 🎜🎜 3. Der Typ der Zeigervariablen bestimmt, auf wie viele Bytes zugegriffen wird, wenn über die Zeigervariable auf den Speicher zugegriffen wird. 🎜🎜 4. Zeigervariablen können nicht kontinuierlich definiert werden (ein * kann nur eine Zeigervariable definieren): 🎜🎜 int* p1,p2; // p ist ein Zeiger, p2 ist eine Variable vom Typ int🎜 🎜 int *p1,*p2; // p1 und p2 sind beide Zeigervariablen🎜🎜Zuweisung: Zeigervariable = Speichernummer. Variable name_p = Adresse; 🎜🎜 Auf die Speichernummer muss zugegriffen werden können. Wenn die Nummer falsch ist, kann dies zu einem Segfault führen. void* kann automatisch in einen beliebigen Zeigertyp konvertiert werden (nicht in C++). Stellen Sie sicher, dass die Adresse mit dem physischen Speicher übereinstimmt (zugeordnet), andernfalls kommt es zu einem Segfault. 🎜
*p_num=10
请输入一个数字:1
*p_num是1
*ptr=10
🎜Zugriff: *Zeigervariable //Dereferenzieren----Zugriff auf Zeigervariable🎜🎜Greifen Sie entsprechend der in der Zeigervariablen gespeicherten Speichernummer auf den entsprechenden Speicher zu. Wenn die zuvor zugewiesene Speichernummer falsch ist, tritt in diesem Schritt ein Segmentierungsfehler auf. Die Bytes, auf die zugegriffen wird, werden durch den Zeigertyp bestimmt. int* p = #                                           Nicht alle Operationen sind sinnvoll. 🎜🎜Zeiger + Ganzzahl = Zeiger + Breite * Ganzzahl 🎜🎜 Zeiger - Ganzzahl = Zeiger - Breite * Ganzzahl // Der Zeiger bewegt sich vorwärts und rückwärts 🎜🎜 Zeiger - Zeiger = (Zeiger - Zeiger)/Breite // Wie groß ist der Abstand? zwischen den beiden Zeigerelementen 🎜🎜 Zeiger>, 91eef5681cad6f0cc96f9adeb2931b45= Zeiger können bestimmen, wer vorne und wer hinten ist. 🎜🎜6. Arrays und Zeiger🎜🎜 Der Array-Name ist eine spezielle Adresse und kann auch als Konstante verwendet werden (der Array-Name entspricht der ersten Adresse des ersten Elements des Arrays). der gewöhnliche Zeiger zeigt auf die Beziehung). Der Array-Name kann eine Zeiger-Dereferenzierung verwenden, und die Zeigervariable kann auch das [];arr[i] 96b4fef55684b9312718d5de63fb7121 des Arrays verwenden. Wenn ein Array als Parameter einer Funktion verwendet wird, geht die Länge verloren und die Sicherheit wird kleiner. void func(int * const arr, size_t len);🎜🎜7, Erweiterte Verwendung von Zeigern🎜🎜 Array-Zeiger und Zeiger-Arrays:🎜 🎜(1). Array-Zeiger (Zeiger): Ein Zeiger, der speziell zum Zeigen auf ein Array verwendet wird. 🎜rrreee🎜void func(int I,int J,int(*arr)[J]) //Zweidimensionale Array-Funktion verwendet Array-Zeiger, um Parameter zu übergeben🎜🎜(2).Pointer-Array ( array): Der in einem Array gespeicherte Datentyp ist ein Zeiger.数据 Fassen Sie die ungeordneten diskreten Daten zusammen. 🎜🎜int* arr[3]; 96b4fef55684b9312718d5de63fb7121 int *p1,*p2,*p3;🎜🎜(3). : Zeiger auf eine Funktion (kann nicht dereferenziert werden) 🎜🎜9, const pointer 🎜🎜 const int * p; // Die Daten im Speicher, auf die der Zeiger zeigt, können nicht durch Dereferenzierung geändert werden 🎜🎜 ( 1) Funktionsparameter schützen 🎜🎜 (2) Wenn der Zeiger auf schreibgeschützte Daten zeigt, sollte auch const hinzugefügt werden, um Segfaults zu verhindern. 🎜🎜 int const * p; // Dasselbe wie oben 🎜🎜 int* const p; // Der Wert der Zeigervariablen kann nicht geändert werden🎜

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

    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视频教程

Das obige ist der detaillierte Inhalt vonWas sind die Verwendungszwecke von Zeigern in der C-Sprache?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn