C++(2)-Zeiger

Zeiger auf den Speicher

Daten müssen im Speicher gespeichert werden, der Speicher ist linear und die Linearität des Speichers ist die physikalische Grundlage

Die Adresse des ersten Bytes des Speicherplatzes stellt die Adresse der Variablen dar, also die Adresse des Low-Bytes

Die Adresse der Variablen: Referenz und zu erhaltender Referenzoperator werden zum Adressoperator

Dereferenz * Dereferenzierungsoperator, auch als Inhaltsoperator bekannt

Um eine Zeigervariable zu deklarieren, müssen zwei Dinge gespeichert werden: Adressdaten und Typ

#include <stdio.h>

// 运算符重载,由语境决定的运算符的属性。

int main()
{
    int data;
    int *pd = &data;  //*用于声明变量

    *pd = 200;  //*为解引用,取内容

    return 0;
}

Zeigervariable

Typ * Zeigername; * wird nur zur Deklaration verwendet

//type * pointerName
// * 表明了本变量指针变量,大小    此处的*仅用于表示声明,类型决定了该指针变量中存储的地址的寻址能力

int main()
{
    int data = 0x12345678;
    int *pd = &data;  //获取地址

    printf("%x\n", *pd);  //12345678
    printf("%x\n", *(int*)pd);  //取4字节  12345678
    printf("%x\n", *(short*)pd);  //取2字节  5678
    printf("%x\n", *(char*)pd);  //取1字节  78

    return 0;
}

int main1()
{
    // int  a = 12;
    // char ch = 'c';
    //float d = 1.2f;

    char a = 1; short b = 2; int c = 3; float f = 4.5; double d = 5.6;

    printf("%d\n", sizeof(char *));  // 4
    printf("%d\n", sizeof(short *));  // 4
    printf("%d\n", sizeof(int *));  // 4
    printf("%d\n", sizeof(float *));  // 4
    printf("%d\n", sizeof(double *));  // 4

    char *pa = &a;
    short *ps = &b;
    int *pi = &c;
    float *pf = &f;
    double *pd = &d;

    printf("%f\n", *&d);  // &d 取地址  *取地址内的值

    return 0;
}

Nehmen Sie die Adresse heraus und fügen Sie sie in die angegebene Variable ein, um den Speicher zu manipulieren

Variable, Zeiger

int main()
{
	int i = 0;
	int* ptr_1;
	int* ptr_2;

	cout << i << endl;  // 0
	cout << &i << endl;  // 001EFBF4  变量i的地址

	cout << "----------" << endl;
	
	ptr_1 = &i;
	cout << &ptr_1 << endl;  // 001EFBE8  指针ptr_1在内存中的地址
	cout << ptr_1 << endl;   // 001EFBF4  ptr_1的内容是i的地址
	cout << *ptr_1 << endl;  // 0	      ptr_1指向单元(i)的内容
	cout << &*ptr_1 << endl; // 001EFBF4  ptr_1指向单元(i)的地址

	cout << "----------" << endl;

	ptr_2 = ptr_1;  // ptr_1的内容赋值给ptr_2
	cout << &ptr_2 << endl;  // 001EFBDC  ptr_2的地址
	cout << ptr_2 << endl;   // 001EFBF4  ptr_2的内容是(i)的地址
	cout << *ptr_2 << endl;  // 0		  ptr_2所指向单元(i)的内容
	cout << &*ptr_2 << endl; // 001EFBF4  ptr_2所指向单元(i)的地址

	return 0;
}

Zeigerkonstante – &a wird als Adresse abgerufen: 0x0028FEBF, ist jedoch nicht äquivalent zu einer Zeigerkonstante

Außerdem muss eine Typbeschränkung vorangestellt sein, *((char*)0x0028FEBF)

Das Wesen eines Zeigers: eine Adresse mit einem Typ (Adressierbarkeit) (die Adresse beginnt mit 16 Bits 0x)

Zeigerkonstante Adresse + Typ

Zeigervariablentyp * pointerName;

include <stdio.h>

int main()
{
    int data = 305419896;  //十进制内容对应地址为0x12345678

    printf("%p\n", &data);  // 12345678
    printf("%p\n", &(char* )data);  // 78
    printf("%p\n", &(short* )data);  //5678
    printf("%p\n", &(int* )data);  //12345678


    return 0;
}

Die Zeigervariable speichert die Adresse und verwendet sie zum Bearbeiten

zeigen auf, darauf hingewiesen werden, das Zeigen ändern

Wer auf wen zeigt, ist eine Beschreibung der Zeigebeziehung des Zeigers

Geben Sie an, an wen bzw. wessen Adresse gespeichert wird

int x (10) Ganzzahlvariable

int * ptr_x (ED53) = &eine Zeigervariable

ptr_x zeigt auf x; x enthält die Adresse von ptr_x

#include <stdio.h>

int main()
{
    int a;
    int *p = &a;  // p指针 指向a的地址
    printf("%p\n", p);

    *p = 100;  // *p = a = 100
    printf("a = %d\n", a);

    int b;
    p = &b;  // p指针 指向b的地址
    *p = 200;  //对*p = b = 200
    printf("b = %d\n", b);

    //想要取得 p的地址
    int ** pp = &p;  //取p的地址,需要**

    return 0;
}

NULL-Zeiger (typloser Zeiger mit Nullwert)

NULL ist ein Makro, das allgemein als Nullzeiger bezeichnet wird und einem Zeiger (void*) 0 entspricht

Schwarzes Loch des Computers, das heißt, es kann nichts gelesen und nichts geschrieben werden

Daher beschädigt die NULL zugewiesene Zeigervariable die Speicherdaten beim Ausführen von Lese- und Schreibvorgängen nicht.

definiere NULL ((void *)0)

#include <stdio.h>

int main()
{
    //对未知的地址进行操作和赋值,无法运行

    //int data;
    int *pa;  // = &data
    
    //printf("%x\n", *pa);

    *pa = 100;


    int * pa = NULL;

    if(pa != NULL):
        *pa = 100;  //NULL即为标识位

    return 0;
}

Die Konsequenzen des erfolgreichen Schreibens eines Wild-Zeigers sind unermesslich.

leere Essenz

Void bedeutet kein Typ und kann an jeden Zeigertyp gesendet werden. Es stellt im Wesentlichen die kleinste Speichereinheit dar und entspricht char auf einem 32-Bit-Computer.

Guess you like

Origin blog.csdn.net/jiangyangll/article/details/132136105