指针是一种间接类型,在电脑中什么意思呢,在开辟的一块指针类型当中,存放的是另一块内存的地址,有了地址以后,就可以通过这种指向的方式来访问并且修改。
其实指针就和目录一样,在书中目录也是要占据地方的,只不过占据的比较少。而且根据目录可以正确的找到,指向的具体位置。
#include <iostream>
using namespace std;
int main()
{
int x=3;
char s='a';
int* p=&x;
char *q=&s;
cout <<sizeof(p)<<endl;
cout<<sizeof(q)<<endl;
return 0;
}
如上面的代码所显示,指针的特点
1、指针也是有类型的,比如int*、char*
2、不同类型的指针可以指向不同类型的对象。
3、不同类型的指针具有的尺寸却是相同的,这点,把上面的程序运行起来发现,在64位机的机器上运行得到的结果都是8。
这里要多说一句,指针的类型只是为了人们使用方便而搞出来的概念,其实类型没有什么意义,指针的本质就是一块内存里面存放的数据是另一块内存的地址。
int* p=&x;//&这个就叫取地址运算符,把x的地址取出来给p,让p指向它。
cout<<*p<<endl;//解引用,解引用的意思就是,我已经有地址了,根据地址去取地址里面的内容。
#include <iostream>
using namespace std;
int main()
{
int x=3;
int y=4;
int* p=&x;
*p=5;
cout<<*p<<endl;
return 0;
}
*p=5;指的是改变指针指向对象的内容。
根据目录找到那一页,把那一页的内容给改了。
#include <iostream>
using namespace std;
int main()
{
int x=3;
int y=4;
int* p=&x;
p=&y;
cout<<*p<<endl;
return 0;
}
改变指针的指向。
改变目录记载的名称对应的页数。
对于指针的定义,一定要有初始的值,否则会指向奇怪的地方,一旦那个地方的数据是很重要的但却被修改的,是很危险的。
int *p=&val;
int *p=nullptr;
定义的方式无非也就是这两种。指向一个明确的地址,或者指向一块空指针(只要不随意指向就是安全的)。
指针主要的操作就是解引用;增加(指针增加p=p+1;。这里的增加,指的是内存里面的地址指向了下一个位置,并不是内存增加了一个字节,而是根据指针类型增加,若是int类型的指针,在64位机上就是增加了4个字节,这里的增加在数组中会非常有用)、减少;判断等。
在某些情况下可能会想声明一个指针,但是有不确定它的类型那么可以使用
void *p=nullptr;
说了那么多那么指针到底有什么好处呢,最重要的一点就是在传输的过程中大大减少了传输的数据量,只需要传一个地址就好,你说方不方便。就跟目录一样那么一本书的内容,只需要那几页目录就了解了,对机器的负担小多了。
对于指针需要注意的问题,就是指针的指向,一定要规定,要是不明确可以直接指向nullptr,但是不能不给地址,否则指向奇怪的地方是很危险的。