指针——面向对象程序设计课堂笔记

主要对老师上课的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.引用

声明引用的过程是为某个变量建立别名的过程(也称某个变量被引用)
在声明引用时需要同时初始化
,被引用的变量可以是任意类型的变量


求引用的地址,实际上返回的是被引用变量的地址

注:

①引用变量初始化后其值不能改变,即不允许把为一个变量建立的引用重新用作另一个变量的别名

②不能引用数组

③不能建立引用的引用

④注意区别声明符&和地址运算符&

【引用作函数参数】

【指针与引用的不同】

①引用不可以是空引用,若对象有可能为空时,必须用指针

②引用本身不能重新赋值,若程序需先指向一个对象后又指向另一个对象,应用指针


posted @ 2020-04-21 23:19  jasf  阅读(405)  评论(1)    收藏  举报