C++ (2) 指针

指针访问内存

数据需要保存到内存中,内存是线性的,内存的线性是物理基础

存储空间的第一个字节的地址表示变量的地址,即低位字节的地址

变量的地址:Reference &  引用运算符取得,成为取地址运算符

dereference * 解引用运算符,也称内容运算符

声明一个指针变量,必须要保存两种东西,地址数据、类型

#include <stdio.h>

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

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

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

    return 0;
}

指针变量

type * pointerName;    *仅用于表示声明

//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;
}

取出地址,并放入到指定变量中,操纵内存

变量、指针

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;
}

指针常量——&a 取出为地址:0x0028FEBF,但是不等价于指针常量

还需要在前面有类型限制, *((char*)0x0028FEBF)

指针的本质:一个有类型(寻址能力)的地址(地址为16位  0x开头)

指针常量  地址+类型

指针变量  type * 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;
}

指针变量保存了地址,并利用地址操纵

指向、被指向、更改指向

谁指向了谁,是描述指针的指向关系

指向谁,即保存了谁的地址

int x  (10)  整型变量

int * ptr_x  (ED53) = &a 指针变量

ptr_x 指向了 x ;x 保存了 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指针(零值无类型指针)

NULL是一个宏,俗称空指针,等价于指针 (void*)0

计算机黑洞,即读不出东西,也写不进去东西

因此被赋值为NULL的指针变量,进行读写操作是不会有内存数据损坏的

define 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;
}

对野指针的写入成功,造成的后果是不可估量的。

void本质

void即无类型,可以发给任意类型的指针,本质代表内存的最小单位,在32位机上地位等同于char

猜你喜欢

转载自blog.csdn.net/jiangyangll/article/details/132136105