用法1:
int *a=new int;
*a=1;
cout<<"方法一:";
cout<<*a<<endl;
delete a;
加*是取指针指向的内存地址存储的元素,不加*是取指针指向的内存地址
cout<<a<<" "<<(&a)<<endl;
输出:0x32de0 0x6cfeec,为什么地址不同?
因为这两个指向的不是同一个地址,a是指针指向的地址,&a是指针本身存储的地址,指针本身也是需要占据内存空间的
但其实上面的代码并不规范,因为并没有给指针进行初始化,且听我娓娓道来:
初始化
int temp=10;
a=&temp;
cout<<*a<<endl;
cout<<a<<" "<<(&a)<<endl;
输出:10 0x6cfee8 0x6cfeec
这里指针指向了temp,保存了变量temp的地址,*a就是这个地址所保存的int类型元素10,而前面并没有对指针进行初始化(*a=1并非初始化),因为a指针指向的是一个随机地址,这个随机地址若指向合法地址(如其他正在运行程序的地址),随后对其赋值如*a=1,可能会修改一个正在使用的值,所以一定要初始化。
用法2:
int *b=new int[2];//动态创建数组
b[0]=10;
b[1]=20;
b[3]=30;
cout<<"方法二:";
cout<<b[0]<<" "<<b[1]<<" "<<b[3]<<endl;
这里没有创建b3的空间却可以输出是因为可以C++支持小范围的非法内存访问,如果访问越界太大则会导致程序崩溃
也可以这样输出
cout<<b[0]<<" ";//10
b++;
cout<<b[0]<<" ";//20
b+=2;
cout<<b[0]<<" "<<endl;//30
用法3(与2做对比):
int *b1=new int[2];//动态创建数组,与法二做对比
*b1=10;
b1++;
*b1=20;
cout<<"方法三:";
cout<<b1[0]<<" "<<b1[1]<<endl;//输出20 未知数据
delete b1;
b1++表示指针指向b1所指的int变量的下一个int型变量地址,这个下一个跨越一整个int型(4个字节) ,所以b[0]输出的不是10而是20,若是b1=b1+i,则说明跨越到当前int型变量之后的第i个int型变量 。
b1[1]输出未知数据的原因是没有进行初始化,内存地址是不断被不同的程序重复使用的,不同的程序使用了这个地址会在这个地址上存储数据,当程序结束时,数据不会立即清除,这个时候就叫做脏数据了(已经过期的、无意义的数据)。定义一个变量,计算机分配地址,正好分配到这个地址上,但是没有初始化变量,也就是没有刷新这个地址上的已有数据,直接使用这个变量时,取到的值就是之前程序存储在这个地址上的值。
用法4:
int *c=new int[2]();//将元素全部初始化为0
cout<<"方法四:";
cout<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
delete c;
用法5:
int *d=new int[2]{0,10};//将元素初始化为0,10
cout<<"方法五:";
cout<<d[0]<<" "<<d[1]<<" "<<endl;
delete d;
如果是 int *d=new int[2]{10};则只会给第一个元素赋值
用法6(与法1做对比):
int *e=new int(20);
cout<<"方法六:";
cout<<*e<<" ";
e++;
*e=100;
cout<<*e;
法一没有在创建的时候初始化指针
int *e=new int[20](20);
这个写法编译不会通过(我也不懂为啥错误,希望有大佬能给我解解惑)。
如果是开辟了数组空间大小,又想要赋值就只能是像用法5那样
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{ /*---------------------------------*/
int *a=new int;
*a=1;//取指针指向的内存地址存储的元素,不加*是地址
cout<<"方法一:";
cout<<*a<<endl;
delete a;
/*---------------------------------*/
int *b=new int[2];//动态创建数组
b[0]=10;
b[1]=20;
b[3]=30;
cout<<"方法二:";
cout<<b[0]<<" "<<b[1]<<" "<<b[3]<<endl;
//这里没有创建b3的位置却可以输出是因为可以C++支持小范围的非法内存访问
//如果下标比较大的话程序就会崩溃
//也可以这样输出:
cout<<b[0]<<" ";//10
b++;
cout<<b[0]<<" ";//20
b+=2;
cout<<b[0]<<" "<<endl;//30
delete b;
/*--------------------------------*/
int *b1=new int[2];//动态创建数组,与法二做对比
*b1=10;
b1++;
//指针指向b1所指的int变量的下一个int型变量地址,这个下一个跨越一整个int型(4个字节)
//若是b1+i,则说明跨越到当前int型变量之后的第i个int型变量
*b1=20;
cout<<"方法三:";
cout<<b1[0]<<" "<<b1[1]<<endl;//输出20 未知数据
//因为指针的起始位置改变了
delete b1;
/*--------------------------------*/
int *c=new int[2]();//将元素全部初始化为0
cout<<"方法四:";
cout<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
delete c;
/*--------------------------------*/
int *d=new int[2]{0,10};//将元素初始化为0,10
cout<<"方法五:";
cout<<d[0]<<" "<<d[1]<<" "<<endl;
delete d;
//如果是 int *d=new int[2]{10};则只会给第一个元素赋值
/*--------------法四------------------*/
int *e=new int(20);
cout<<"方法六:";
cout<<*e<<" ";
e++;
*e=100;
cout<<*e;
return 0;
}