C++ 指针(一)

目录

一、指针概述

1.1指针的声明

1.2指针的初始化

1.3解引用

二、用new简单分配内存

2.1用new分配内存

2.2用delete释放内存

三、数组和指针


一、指针概述

简单来说,指针能够指向某个值,指针变量存储的是该值的地址,而不是值本身。

1.1指针的声明

#include

using namespace std;

int main(){
    int value_p = 5;
    int* pointer1; //此处声明指针变量
    pointer1 = &value_p;

    //对于*的位置,指针变量的声明也可以如下
    //int *pointer2;
    //int * pointer3;
    //int*pointer4;
    return 0;
}

指针都是基于其他的类型的,所以在声明指针变量时需要指出他的类型(auto可以自动判断指针的类型)。此处要注意的是,*的位置并没有明确的规定,*两边的空格并没有严格的规定,是可选的。但是,对于下面的代码段:

int* pointer, value;

pointer是指针变量,value是int类型的变量,如果需要同时声明两个指针变量,每一个指针变量都需要有*应如下:

int* pointer1, *pointer2;

1.2指针的初始化

声明指针之后需要对指针进行初始化。

int value_p = 5;
int* pointer1 = &value_p;

上述代码中,&的作用是取value_p的地址。需要注意的是,上述的初始化是对指针初始化,而不是指向地址的值进行初始化。

特别要注意,一个指针在声明之后需要对其进行初始化,否则该指针指向一个未知的空间,变成野指针,将会导致程序出现不可控的bug。

1.3解引用

*为解引用运算符。简单来说,就是通过使用*运算符,可以访问某段内存的地址。通俗地来讲,指针就等于门牌号,解引用就是通过门牌号找到具体的地方。

int value = 5;
int*p = &value;
*p = 6;
cout<<*p<

二、用new简单分配内存

2.1用new分配内存

用new创建指针的格式如下

type_name * pointer = new type_name [num];

一般情况下,不需要使用num,即

int* p = new int;

意思是,给p指针所指向的内存分配一块int类型数据所需长度的内存空间。注意,该空间是在堆(heap)上进行分配的。

当然使用num可以创建动态数组。例如

int* p = new int [10];

上述代码的意思是,为p指针所指向的空间开辟一块sizeof(int)*10长度的内存空间。

注意这个num可以是一个变量,所以叫动态创建数组,意思是数组的长度一开始并不是固定的,可以通过变量进行指定。

2.2用delete释放内存

delete的作用就是释放new所分配的内存空间,使用方法:

int* pointer1 = new int;
int* pointer2 = new int[10];

delete pointer1;
delete [] pointer2;

注意,delete只是会释放new所分配的内存空间,但是不会销毁指针本身,在使用delete之后,仍然可以使用该指针。

使用delete需要注意几点:

  • delete只能释放new所分配的空间,但是空指针也能使用delete;
  • new和delete需要一一对应,即一个new对应一个delete,一个new[]对应一个delete[];
  • 不能对同一个内存释放两次。

三、数组和指针

上面已经说过了动态内存的分配,但是动态内存分配的指针是指向该内存的第一个元素,也就是说,你无法直接访问后面的元素,那么该如何访问呢?其实和数组访问元素一样,直接使用[]就可以对元素进行访问。这间接揭示了,C++内部也是使用指针来处理数组的。

但是数组名和指针的区别在何处呢?看下面代码:

int* p = new int [10];
int arr[10];

p = p + 1;
arr = arr + 1;

对于指针+=1的操作,是正确的的语句,意思是p指向下一个元素;对于数组名+=1的操作,是错误的操作,是不允许的,我们不能够修改数组名的值。

如有错误欢迎指正!

你可能感兴趣的:(C/C++,c++,算法,开发语言)