指针访问内存
数据需要保存到内存中,内存是线性的,内存的线性是物理基础
存储空间的第一个字节的地址表示变量的地址,即低位字节的地址
变量的地址: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