1.基本指针
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int* p = &a;
cout << *p << endl;
system("pause");
return 0;
}
这是最简单的一个指针,int * p=&a;但是在这个指针中我们要知道数据类型并不是int *,而是int ,*只是一个指针操作符,用来声明一个指针变量,Int的根据是看所指向的变量的数据类型,在这个指针中,指针所指向的变量是int a,所以指针的数据类型为Int。
2.指针的占用内存空间
x86(32位):4个字节
x64(64位):8个字节
3.空指针
int* b = NULL; 空指针的作用是用来初始化指针,但是却不可以访问空指针,因为内存编号为0-255的是系统占用内存,不允许用户访问,但是却可以查看地址,可以看到指针指向的内存编号,cout<<b<<endl;
4.野指针
int* b = (int *)0x1100;在这个代码中,为什么我们要用int *进行强转呢,因为若不强转的话电脑可能认为我们是将一个整数赋值给一个指针b,16进制的数也还是整数,不要认为16进制的数就是地址,虽然地址经常用16进制的数来表示,但这是因为16进制提供了一种紧凑的方式表达二进制,因为计算机内存和地址本质上都是基于二进制的,所以不要认为16进制的数就是内存。
这个代码同样无法获取指针所指向的值,但可以获取所指向的地址,也就是b。
5.常量与指针
常量是const,
常量指针:const int * p=&a; 指针指向的值不可以修改
指针常量:int *const p=&a; 指针的指向不可以修改
const int *const p=&a; 指针的值以及指向都不可以修改
6.利用指针遍历数组
int* p = arr;这里指针指向数组的首地址,若直接输出*p解引用的话就输出的是第一个元素1,我们弄一个for循环,在每次打印后,进行p++,由于p是一个整型指针,在执行p++后,p的地址会增加sizeof(p的数据类型)个字节从而跳转到下个整数元素,注:一个字节由8位bit组成,而一个bit可以表示0-255中的任何数值,每个元素都占用一定的字节,若一个数组中第一个元素中地址为0x1000,那么增加4个字节后为0x1004,即为第二个元素的地址,16进制的数通常用0x开头代表,
再注意,当一个地址是0x1000,增加4个字节是位0x1004,一个字节增加一位,当增加字节后就到了下一个元素的地址,所以说知道第一个元素的地址后可以通过增加字节来获取下一个元素的字节,就如上图代码中的p++。