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.