指针和引用

1.1 指针及其应用

1.1.1 被调用函数中修改主调函数的变量

	编写一个sort 函数,将主函数中的变量重新赋值,赋值后a >=b >= c,并在主函数中补充上函数调用语句。

下面展示一些 内联代码片

	int main(){
		int a = 80, b = 60, c = 90;
		_____________________;
		cout<<a<<" "<<b<<" "<<c<<endl;
		getcharr();	
	}
	void swap(int *m, int *n){
		int t = *m;
		*m = *n;
		*n = t;
	}
	void sort(int *pa, int *pb, int *pc){
		if(*pa > *pb)swap(*pa, *pb);
		if(*pb > *pc)swap(*pb, *pc);
		if(*pa > *pb)swap(*pa, *pb);
	}
	int main(){
		int a = 80, b = 60, c = 90;
		sort (&a,&b,&c);
		cout<<a<<""<<b<<""<<c<<endl;
		getchar();	
	}
	

1.1.2 简述指针和句柄的区别

	句柄是一个32位无符号整数,表示一个对象的内存地址列表的整数索引,是分配给资源的唯一标识,这里面的对
象指的是诸如应用程序实例、窗口、位图、GDI之类的资源对象。
	在概念上,句柄中记录着资源对象列表中某个成员的索引,其作用类似于指向指针的指针,虽然句柄本质上也是
一个指针,但是指针可以随意指向一个对象,而句柄只能间接指向资源对象。
	在使用上,通过指针可以直接修改指针指向的内容;通过句柄只能调用一些widows提供的API函数。这种对句柄
的限制主要出于安全考虑,防止用户随意修改系统资源,从而导致异常情况发生。

1.2 指针常量与常量指针

1.2.1 指针常量与常量指针常见问题

	指针常量(指针类型的常量):本质上是一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常
量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。用法如下:
	int a  = 10, b = 20;
	int *const p = &a;
	*P = 30;
	常量指针(指向常量的指针):本质是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常
量指针中,指针指向的内容是不可改变的,指针看起来就好像指向一个常量。用法如下:
	int a  = 10, b = 20;
	const int* p = &a;
	p = &b;
	常量地址不能初始化普通指针,常量地址可以初始化常量指针
常量指针指针常量
可以修改指针的值不可以修改指针的值
不可以修改指针指向的内容可以修改指针指向的内容
定义时必须初始化
不能在定义后赋值

1.3 指针数组和数组指针

1.3.1 知识点梳理

	指针数组:存放指针的数组
			 本质上是一个数组,指针是数组中的内容,表示数组中的每个元素都是指针;
			 指针数组的定义:指向变量类型 * 数组名称[数组长度];
	数组指针:指向数组的指针
			 本质上是一个指针,数组是指针指向的类型,表示指针指向一个数组;
			 数组指针的定义:数组元素类型(* 指针名称)[数组长度];
	区分指针数组和数组指针:
		无()则p 与[ ]首先结合构成数组,从而声明一个指针数组:int * p[3];
		有()则p 与 * 首先结合构成指针,从而声明一个数组指针:int(*p)[3]。

1.3.2 简述数组指针与二维数组的区别

	请写出下面程序的输出结果(假设数组a的地址&a为 0x001DF720):
	int main(){
		int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
		int(*p)[5] = a;
		cout<<p<<endl;
		cout<<p+1<<endl;
		
		cout<<*p<<endl;
		cout<<*(p+1)<<endl;	
		cout<<*p+1<<endl;	
		
		cout<<**p<<endl;	
		cout<<**(p+1)<<endl;	
		cout<<**p+1<<endl;	
		getchar();
	}
	注意:无论一维数组、二维数组或N维数组,数组名始终等价于数组首元素地址:a<=>&a[0]. 
	cout<<p<<endl: 输出数组a 首元素的地址&a[0],即输出数组a 的地址,输出结果为0x001DF720;
	cout<<p+1<<endl: 输出数组a 第二个元素的地址&a[1],其地址为偏移后的地址,输出结果为0x001DF734;
	cout<<*p<<endl:输出数组a 的地址&a,输出结果为0x001DF720;
	cout<<*(p+1)<<endl:输出数组a[1]的首元素地址,输出结果为0x001DF734;
	cout<<*p+1<<endl:输出数组a[0][1]的元素地址,输出结果为0x001DF724;
	cout<<**p<<endl:输出数组a[0]首元素的值a[0][0]:1;
	cout<<**(p+1)<<endl:输出数组a[1]首元素的值a[1][0]:6;
	cout<<*(*p+1)<<endl:输出数组a[0][1]的值:2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值