指针
指针是一个变量,存储的是值得地址,假设 a 是一个变量,那么&a就是他的地址。#include<iostream>
using namespace std;
int main()
{
int a=10;
cout<<a<<" address = "<<&a<<endl;
}
***********************************************
#inlude<iostream>
using namespace std;
int main()
{
int a=10;
int* p ; //声明了一个int型的指针
p = &a;
cout<< a <<" "<<*p<<endl; // 10 10
cout<<&a<<" "<<p<<endl;
*p=*p+1; // 11
cout<<a<<endl;
}
**********************
指针的危险
在C++中创建指针的时候,计算机将分配用来存储地址的内存,但不会分配 存储 指针所指向的数据 的内存
int* p;
*p = 10;
p是一个指针,但并不知道他指向哪里,上述代码并没有将地址赋给p,那么10存储在哪呢,并不知道,如果p的值恰巧是程序代码的地址,但很有可能并不是要存储10的地址。
*******************************
之前我们都是将指针初始化为变量的地址,变量是在编译时分配的有名称的内存,而指针只是可以通过名称直接访问的内存提供一个别名。
而指针的真正的用武之地是在运行阶段分配未命名的内存来存储值,在这种情况下,只能通过指针来访问内存,NEW运算。
int* p = new int;
new int告诉程序,需要适合存储int的内存,new运算根据类型来确定需要多少字节的内存,然后,找到这样的内存,返回地址,赋给p,p就是指向int的指针。
比较:
int a;
int* pp = &a;
这两种情况,都是将一个int变量的地址赋给了指针,在pp中,我们可以通过名字a来访问该int,在第一种情况下,只能通过指针来访问。
new分配内存块在堆中,而变量的则在栈中。
delete只能释放new出来的内存块,但是指针并不消失,还可以重新指向另一个新分配的内存块。
*******************************************
#include<iostream>
uisng namespace std;
int main(){
double* p = new double[3];
p[0] = 0.1;
p[1] = 0.2;
p[2] = 0.3;
cout<<p[1]<<endl; // 0.2
p = p+1;
cout<<p[0] <<" "<< p[1]<<endl; //0.2 0.3
p=p-1; //与最开始一样了
delete[] p;
return 0;
}
****************************************************
#include<iostream>
using namespace std;
struct infla
{
char name[20];
float v;
double pri;
};
int main()
{
infla* p = new infla;
cin.get(p->name,20); //hhx
cin.get(*p).v; //1.4
cin>>p->pri; // 27.9
cout<<(*p).name<<endl; // hhx
cout<<p->v<<endl; //1.4
cout<<p->pri<<endl; //27.9
delete p;
return 0;
}
浙公网安备 33010602011771号