C++原始指针

2018-06-02  本文已影响491人  VoyagerOne

最近在整理寝室的时候,发现一本大一的 C++ 笔记,现把里面觉得总结得还不错的知识分享出来。

指针定义

指针也是一个变量,只不过其存放的是内存地址,可以是另一个变量的地址或者一个函数的地址。
当然因为是一个变量,所以指针也需要类型声明。

指针声明

在 C++ 中声明指针只需要在变量名前添加 * 符号,另外尽量在声明时进行初始化,不然指针将可能包含无用地址。

int *ptr{nullptr} //  ptr被声明为空指针,没有指向

获取地址

既然指针存放地址,那么如何获取一个变量的地址呢,需要用到取地址操作 &

int num{100};
cout << num << endl; // 100
cout << sizeof(num) << endl; // 4 // bytes
cout << &num; // 0x7ffee73c5598

& 可以获取变量在内存中的地址。

访问指针

既然已经获取地址,怎么获取这个内存地址中存放的值呢,需要用到 * 操作。

int *p{nullptr};
int num{100};
p = &num;
cout << p; // 0x7ffeebca25ac100
cout << *p; // 100

获得某变量的访问后,除了获取其值,还可以修改其值。

int num{100};
int *p{&num};
cout << *p; // 100
*p = 300;
cout << *p; // 300
cout << num; // 300

数组指针

由于数组是连续的存放在内存中,所以数组的地址是其第一个元素的内存地址。同样的,指向数组的指针,实际上是指向数组第一个元素的指针。

int *p;
int arr[]{1,2,3,4};
p = arr;
cout<<p<<endl; // 0x7ffeee9a65a0
cout<<&arr<<endl; // 0x7ffeee9a65a0
cout<<arr<<endl; // 0x7ffeee9a65a0
cout<<*(p+1)<<endl; // 2 // 由于是连续存放,所以 `p+1` 是第二个元素的地址
cout<<p[1]<<endl; // 2 

vector 指针

访问 vector 指针比访问原生数组要简单得多,仅仅需要将指针指向 vector 即可,但要注意在访问时,需要用 ( ) 将指正括起来,否则无法判断是访问 vector 还是访问一个指针数组的指向。

vector<string> arr{"one", "two", "three"};
vector<string> *ptr{&arr};
cout << (*ptr)[0] << endl;

动态内存分配

在 C++ 中我们可以使用 new 关键字来动态分配内容,而 new 操作后返回的是分配内容的地址,所以我们需要用指针变量来赋值。

int *ptr{nullptr};
ptr = new int;
*ptr = 300;
cout << *ptr; // 300
delete ptr;

因为是手动分配的内存空间,所以不会被自动回收,需要手动释放空间,使用 delete 即可回收内容,防止内存泄露。

也可以动态分配一组连续的内存空间,即数组。

int *ptr{nullptr};
int size{10};
ptr = new int[size];
ptr[0] = 90;
ptr[4] = 20;
cout << ptr[4]; // 20
delete[]ptr;

指针运算

指针同其他变量一样是可以参与运算的。在比较运算中( ==, != ···),参与比较的是指针变量中存放的值,即地址,而非地址所指的值。在加减运算时,指针值的增减量是其类型所占内容大小的增减量:

int *ptr{nullptr};
int num{10};
ptr = &num;
cout << ptr << endl; // 0x7ffee10b2584
cout << ptr + 1 << endl; // 0x7ffee10b2588
cout << sizeof(int) << endl; // 4

指针与 const

const 在C++中表示常量,与指针有多重结合方式:

int num = {200};
int *const p{&num};
*p = 0;  // OK
++p; // Error,常量指针,不能再重新赋值
------||------
int num = {200};
const int * p{&num};
*p = 0; // Error, 只读指针
++p; // OK
------||------
int num = {200};
const int * const p{&num};
*p = 0; // Error, 只读指针
++p; // Error, 常量指针,不能再重新赋值
上一篇下一篇

猜你喜欢

热点阅读