美文网首页
C++原始指针

C++原始指针

作者: VoyagerOne | 来源:发表于2018-06-02 17:19 被阅读491次

最近在整理寝室的时候,发现一本大一的 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, 常量指针,不能再重新赋值

相关文章

  • C++原始指针

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

  • C++知识点

    C++基本方法: C++ memcpy C++基本特性: C++引用(vs指针) C++指针 C++封装: 将...

  • C++ 指针常量、常量指针和常指针常量

    参考:C++ 指针常量、常量指针和常指针常量

  • Java基础

    Java和C++的区别?a. Java没有指针。c++可以通过指针直接操作内存,但这个动作是危险的,指针引起的操作...

  • Jna send pointer pointer to c++

    目的: 有这样一个需求,java通过jna传递指针数组给c++,或者指针的指针 解决方案: c++ : 声明 vo...

  • C++ 指向类的指针

    原文地址:C++ 指向类的指针 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • 从智能指针std::shared_ptr中取出原始指针

    使用get方法可以取出智能指针中的原始指针: 但取出的原始指针,可能被释放,因此使用这个指针是不安全的,如在不同线...

  • C++函数指针和Swift的函数对象

    C++函数指针和Swift的函数对象 在C++中学习函数指针式非常痛苦的事情,而在Swift里面学习函数指针则是非...

  • [C++之旅] 16 对象指针/对象成员指针/this指针

    [C++之旅] 16 对象指针/对象成员指针/this指针 一、对象指针 对象指针指向堆中地址 对象指针指向栈中地...

网友评论

      本文标题:C++原始指针

      本文链接:https://www.haomeiwen.com/subject/horrsftx.html