指针的基本概念
作用:通过指针间接访问内存。
内存编号从0开始,一般使用16进制表示。
可以利用指针变量保存地址。
指针变量定义和使用
数据类型*变量名
#include<iostream>
using namespace std;
int main(){
//定义指针
int a=10;
//指针定义语法 数据类型*指针变量名
int*p;
//让指针记录a的地址
p=&a;
cout<<"a的地址为"<<&a<<endl;
cout<<"指针p的值为"<<p<<endl;
//使用指针
//使用解引用方式找到指针指向的内存
//指针前加*找到指针指向内存中的数据
*p=1000;
cout<<"a的值为"<<a<<endl;
cout<<"*p的值为"<<*p<<endl;
return 0;
}
控制台:
通过对内存进行操作,直接修改变量的值。
指针所占的内存空间
32位操作系统:占用4个字节
64位操作系统:占用8个字节
#include<iostream>
using namespace std;
int main(){
//定义指针
int a=10;
//指针定义语法 数据类型*指针变量名
int*p;
//让指针记录a的地址
p=&a;
cout<<"sizeof(int*)="<<sizeof(p)<<endl;
cout<<"sizeof(float*)="<<sizeof(float*)<<endl;
cout<<"sizeof(double*)="<<sizeof(double*)<<endl;
cout<<"sizeof(char*)="<<sizeof(char*)<<endl;
system("pause");
return 0;
}
空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针量
注意:空指针指向的内存不可以访问
#include<iostream>
using namespace std;
int main(){
//指针变量p指向内存地址编号为0的空间,对指针变量进行初始化
int*p=NULL;
//空指针不能访问
//0-255之间内存编号系统占有,不可以访问
cout<<*p<<endl;
system("pause");
return 0;
}
下面程序运行会出现报错或无任何形式输出。
野指针:指针变量指向非法内存空间
#include<iostream>
using namespace std;
int main(){
//野指针
int *p=(int*)0x1100;
cout<<*p<<endl;
system("pause");
return 0;
}
程序运行会出现报错或无任何形式输出。
不要随意更改空指针或野指针。
const修饰指针
const修饰指针 常量指针
const修饰常量 指针常量
const修饰指针也修饰常量
#include<iostream>
using namespace std;
int main(){
int a=10;
int b=10;
int c=30;
//const修饰指针
const int*p=&a;//指针指向可以修改,指针指向的值不能修改
cout<<"a:"<<*p<<endl;
int *const p1=&b;//指针常量,指针指向不能修改,但指针指向值可以修改
*p1=20;
cout<<"b:"<<b<<endl;
const int *const p2=&c; //指针指向和值都不能修改
cout<<"*p2:"<<*p2<<endl;
cout<<"c:"<<c<<endl;
system("pause");
return 0;
}
指针和数组
利用指针访问数组中的元素。
#include<iostream>
using namespace std;
int main(){
int a[]={1,2,3,4,5,6,7,8,9,10};
//第一个元素
cout<<"a[0]:"<<a[0]<<endl;
int*p=a;//a就是数组首地址
cout<<"利用指针访问第一个元素:"<<*p<<endl;
p++;
cout<<"利用指针访问第二个元素:"<<*p<<endl;
cout<<"利用指针访问数组元素素:"<<endl;
int*p2=a;
for(int i=0;i<10;i++){
cout<<*p2++<<" ";
}
system("pause");
return 0;
}
指针和函数
利用指针做函数参数,可以修改实参的值。
#include<iostream>
using namespace std;
//实现两个数组交换
void swap1(int a,int b){
int tmp=a;
a=b;
b=tmp;
}
void swap2(int*p1,int*p2){
int tmp=*p1;
*p1=*p2;
*p2=tmp;
}
int main(){
//值传递
int a=10;
int b=20;
swap1(a,b);
cout<<"swap1a= "<<a<<endl;
cout<<"swap1b= "<<b<<endl;
//地址传递
swap2(&a,&b);
cout<<"swap2a= "<<a<<endl;
cout<<"swap2b= "<<b<<endl;
system("pause");
return 0;
}
值传递只能改变形参的值,不能改变实参的值。
而地址传递可以改变实参的值。
指针,数组,函数
封装一个函数,利用冒泡排序,实现对整型数组的升序排序。
#include<iostream>
using namespace std;
//冒泡排序 数组首地址 数组长度
void bubble(int*a,int len){
for(int i=0;i<len-1;i++)
for(int j=0;j<len-i-1;j++){
if(a[j]>a[j+1]){
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
void printArr(int*a,int len){
for(int i=0;i<len;i++){
cout<<a[i]<<" ";
}
}
int main(){
int a[]={1,9,8,2,7,4,6,5};
int len=sizeof(a)/sizeof(a[0]);
bubble(a,len);
printArr(a,len);
system("pause");
return 0;
}