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;