(一)指针
#include <iostream>
using namespace std;
int main()
{
int a=10;
int* p;
p=&a;
cout<<"变量a的值\t"<<a<<endl;
cout<<"变量a的地址\t"<<&a<<endl;
cout<<"指针p的值\t"<<p<<endl;
cout<<"指针p的地址\t"<<&p<<endl;
cout<<"变量a的值\t"<<*p<<endl;
cout<<"int指针大小\t"<<sizeof(int*)<<endl;
cout<<"double指针大小\t"<<sizeof(double*)<<endl;
cout<<"string指针大小\t"<<sizeof(string*)<<endl;
return 0;
}
输出(本人电脑Ubuntu16.04是64位的)
变量a的值 10
变量a的地址 0x7ffdb9b4f24c
指针p的值 0x7ffdb9b4f24c
指针p的地址 0x7ffdb9b4f250
变量a的值 10
int指针大小 8
double指针大小 8
string指针大小 8
(二)空指针和野指针
- 空指针:指针变量指向内存编号为0的空间
用途:初始化指针变量
注意:空指针指向内存不可以访问 - 野指针:指针变量指向非法的内存空间
(三)const修饰指针
1.const修饰指针——常量指针
#include <iostream>
using namespace std;
int main()
{
int a=10;
int b=20;
const int* p=&a;
cout<<p<<endl;
p=&b;
cout<<p<<endl;
cout<<*p<<endl;
return 0;
}
输出
0x7ffc91723f28
0x7ffc91723f2c
20
特点:常量指针指向可以修改,但指向的值不可以修改
*p=30; //会提示错误
2.const修饰常量——指针常量
#include <iostream>
using namespace std;
int main()
{
int a=10;
int b=20;
int* const p=&a;
cout<<p<<endl;
cout<<*p<<endl;
*p=50;
cout<<*p<<endl;
return 0;
}
输出
0x7fff704eba98
10
50
特点:指针常量指向不可以修改,但指向的值可以修改
3.死指针
#include <iostream>
using namespace std;
int main()
{
int a=10;
int b=20;
const int* const p=&a;
cout<<p<<endl;
cout<<*p<<endl;
return 0;
}
特点:指针指向和指向的值都不可以修改
(四)指针和数组
#include <iostream>
using namespace std;
int main()
{
int array[10]={1,2,3,4,5,6,7,8,9,10};
int* p=array; //数组名就是地址
for(int a=0;a<10;a++)
{
cout<<"hello world"<<*p<<endl;
p++; //地址+1不是按1个字节加的,而是8个字节(针对64位)
}
return 0;
}
(五)指针和函数
#include <iostream>
using namespace std;
void swap1(int a,int b)
{
int temp=a;
a=b;
b=temp;
cout<<"a地址"<<&a<<endl;
cout<<"b地址"<<&b<<endl;
}
void swap2(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int x=10;
int y=30;
cout<<"x数值"<<x<<endl;
cout<<"y数值"<<y<<endl;
cout<<"x地址"<<&x<<endl;
cout<<"y地址"<<&y<<endl;
swap1(x,y);
cout<<"x数值"<<x<<endl;
cout<<"y数值"<<y<<endl;
swap2(&x,&y);
cout<<"x数值"<<x<<endl;
cout<<"y数值"<<y<<endl;
return 0;
}
输出
x数值10
y数值30
x地址0x7ffe05e9c850
y地址0x7ffe05e9c854
a地址0x7ffe05e9c82c
b地址0x7ffe05e9c828
x数值10
y数值30
x数值30
y数值10
1.swap1函数,值传递,形参不影响实参,为形参独立分配内存空间(从输出中可以看出a的地址和x的地址不一样,说明调用函数时为形参开辟新的内存单元)
2.swap2函数,地址传递,可以交换值