一,指针的定义
指针用于记录变量的地址。
代码示例:
#include<iostream>
using namespace std;
int main(){
int a=0;
int * p; (int * 为一体)
p=&a; p为a的地址
cout<<"a的地址为:"<<&a<<endl;
cout<<"指针p为:"<<p<<endl;
*p=1000; *p代表取p地址对应变量a
cout<<"a="<<a<<endl;
cout<<"*p="<<*p<<endl;
system("pause");
return 0;
}
a的地址为:0135FD1C
指针p为:0135FD1C
a=1000
*p=1000
注:指针在32位系统下占用4个字节(一个16进制数)(默认情况),在64位操作系统下占用8个字节
二, 空指针和野指针
1.空指针:int * p=NULL 用于初始化指针变量,空指针指向内存不可访问。
2.野指针:指针变量指向非法内存
错误代码示例1:
include<iostream>
using namespace std;
int main(){
int * p=NULL;
*p=100; 定义空指针后不可对其进行访问,故程序出错
cout<<*p<<endl;
system("pause");
return 0;
}
错误代码示例2:
#include<iostream>
using namespace std;
int main(){
int * p=(int *)0x1100; 自行定义的地址未经申请故不可访问程序出错
cout<<*p<<endl;
system("pause");
return 0;
}
三,const修饰指针
1.常量指针:指针的指向的方向可以修改,但值不能改。
int a=10; int b=20; const int * p=&a; p=&b; 常量指针可以改地址
2.指针常量:指针方向不可该,值可改。
int a=10; int b=20; int * const p=&a; *p=20; 指针常量可改值
3.指针和常量都被修饰时:
const int * const p=&a;
此时指针方向和值都不能修改
四,指针与数组
可以用指针来遍历数组中的每一个元素。
代码示例i:
#include<iostream>
using namespace std;
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
int * p=a; 取首地址
for(int i=0;i<10;i++){
cout<<* p<<" ";
p++; 向后移四个字节,即跳到下一个元素
}
system("pause");
return 0;
}
五,指针与函数
1.值传递:形参变,实参不变
2.地址传递:可通过地址改变实参
代码示例:地址传递
#include<iostream>
using namespace std;
void swap1(int * p1,int * p2){
int temp=*p1;
*p1=*p2;
*p2=temp;
}
int main(){
int a=10;
int b=20;
swap1(&a,&b); 交换地址
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
system("pause");
return 0;
}
a=20
b=10
实际应用:
问题:封装一个函数,利用冒泡排序实现对数组的升序排列
#include<iostream>
using namespace std;
void increase(int *a,int length){ 参数:首地址,长度
for(int i=0;i<length-1;i++){
for(int j=0;j<length-1-i;j++){
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
int main(){
int a[10]={4,3,6,9,1,2,10,8,7,5};
increase(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
system("pause");
return 0;
}
1 2 3 4 5 6 7 8 9 10