指针——面向对象程序设计课堂笔记
主要对老师上课的ppt的笔记整理及补充
指针
指针是一种特殊的变量,它存储的数值是内存中的一个地址
主要掌握:①指针的类型 ②指针所指向的类型 ③指针的值或者指针所指向的内存区 ④指针本身所占据的内存区
1.指针变量的定义
从右向左念!
2.指针变量赋值
3.指针变量的引用
(1)指针p指向变量m
(2)
(3)野指针(不用)
指针p为野指针,但编译器不会报错,输出的值一般为变量m的默认值
4.指针的类型
指针声明语句中的指针名字去掉,剩下的部分就是这个指针的类型
5.指针所指向的类型
把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型
6.void指针(不可有)
编译器会报错,因为不知道指针指向的值占有多少空间(即只知道起始地址,不知道结束地址,编译器根据指向的类型确定结束地址)
7.指针本身所占据的内存区
sizeof(指针类型)=4个字节
8.指针运算符
(1)交换指针变量指向的整型变量
(2)交换指针指向
9.
10.指针变量作函数参数
(1)交换两个数的值
#include<iostream>
using namespace std;
int main()
{
void change(int *p1,int *p2);
int *p1,*p2,a,b;
cin>>a>>b;
p1=&a;
p2=&b;
change(p1,p2);
cout<<*p1<<","<<*p2<<endl;
return 0;
}
void change(int *p1,int *p2)
{
int t;
if(*p1<*p2)//交换内存变量的值
{
t=*p1;
*p1=*p2;
*p2=t;
}
return;
}
(2)未交换两个数的值(形参的交换不会影响实参)
#include<iostream>
using namespace std;
int main()
{
void change(int *p1,int *p2);
int *p1,*p2,a,b;
cin>>a>>b;
p1=&a;
p2=&b;
change(p1,p2);
cout<<*p1<<","<<*p2<<endl;
return 0;
}
void change(int *p1,int *p2)
{
int *t;
if(*p1<*p2)
{
t=p1;
p1=p2;
p2=t;
}
return;
}
11.用指针变量作函数形参接受数组地址
数组名作函数参数,传递的是数组首元素的地址,用指针变量作函数形参,也可以接收数组首元素的地址
#include<iostream>
using namespace std;
int main()
{
void select_sort(int *p, int n);
int a[10], i;
cout<<"enter the original array:"<<endl;
for(i=0;i<10;i++)
cin>>a[i];
cout<<endl;
select_sort(a, 10);
cout<<"the sorted array:"<<endl;
for(i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
void select_sort(int *p,int n)
{
int i,min,t,j;
for(i=0;i<n;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(*(p+j)<*(p+min)) min=j;
}
t=*(p+min);
*(p+min)=*(p+i);
*(p+i)=t;
}
}
11.指针与数组
(1)
int a[10],*p;
p=a;//或p=&a[0];
等价:p+n , a+n , &a[n]
等价:*(p+n) , *(a+n) , , a[n] , p[n]
(2)
12.数组指针与指针数组
(1)数组指针(也称行指针)
定义:int(*p)[n];
()优先级最高
p是一个指针,指向一个含n个元素的整型数组(只有1个指针)
(2)指针数组
定义:int *p[n];
[]优先级最高
一个装有n个指针的数组(有n个指针)
13.指针与二维数组
14.指针与字符数组
15.数组指针作函数的参数
16.动态数组
(1)C语言中定义数组时必须确定长度,在运行过程中数组长度不变。为了使数组更加灵活,可采用动态数组(动态内存分配)
(2)C语言中使用函数malloc和free进行分配和回收,C++中常用new和delete运算符
注意:
①如果无内存分配,则返回空指针NULL,所以应该检查有无内存分配(格式)
int *p=(int*)malloc(MAXSIZE*sizeof(int));
if(p==NULL)
{
printf("allocation failure");
exit(1);
}
②free用来释放不需要的内存空间 free(指针变量名);
如果释放一个已经释放的内存可能导致程序崩溃,所以释放后最后置为0
17.指向指针的指针: 类型标识符 **指针变量名
float **p;
float*(*p);
18.const
(1)const变量和常量
C++中,const型变量被称为const常量
定义方式:const 类型标识符 变量名=初始化数据
const型变量必须初始化,定义后已经是常量,不可以修改或赋值
const int n=5;
const int d[]={1,2,3,4};
n=6;//非法
d[2]=12;非法
与宏常量的区别:宏常量在编译预处理时被相应文本替换,不做编译检查,而const型常量要进行编译检查
(2)const限定修饰符:在其作用域内不能改变
①防止在函数体内改变参数的值
②减小程序出错的可能性
③提高程序的可维护性
(3)const指针
①指向常量的指针变量: const 类型名 *指针变量名;
不能通过指针来改变它所指向的值,但指针本身的值可以改变,即指针可指向其他数据
int a=1,b=3;
const int *p1=0;//声明指向int型常量的指针p1
p1=&a;//将int型变量a的地址赋给指针
*p1=2;//错误,不能通过指针来改变它所指向的值
a=2;//正确,变量的值可通过变量名改变
p1=&b;//正确,指针本身的值可以改变
②指针常量(常指针): 类型名 *const 指针变量名;
指针本身的值不可改变,即不能再指向其他数据,但它指向的数据的值可以改变
在声明常指针时必须初始化(除非是函数的形参)
int a=1,b=2;
int *const p1=&a;
int *const p2;//错误,在声明指针常量时必须初始化
*p1=2;//正确,指向的数据的值可以改变
p1=&b;//错误,指针常量本身的值不可改变
③指向常量的常指针: const 类型名 *const 指针变量名;
指针本身的值不可改变,它所指向的数据的值也不能通过指针改变
int a=10,n=20;
const int *const p1=&a;
*p1=2;//错误,指针常量指向的值不可以改变
p1=&b;//错误,指针常量本身的值不可改变
a=30;//正确,变量的值可通过变量名改变
19.引用
声明引用的过程是为某个变量建立别名的过程(也称某个变量被引用)
在声明引用时需要同时初始化
,被引用的变量可以是任意类型的变量
求引用的地址,实际上返回的是被引用变量的地址