指针变量的定义、赋值
一般形式为: 类型说明符 *变量名;
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示该指 针变量所指向的变量的数据类型。
1. int a=0,b=1; 2. int c[]={1,2,3,4,5,6,7,8,9,10}; 3. int *p; //定义一个指针 4. p=&a; //让p指向a 5. (*p)=3; //相当于a=3; 6. (*p)=b; //相当于a=b,此时a等于1 7. //p=b; //非法操作,左边是int*,右边是int,类型不匹配 8. p=&b; //让p指向b,从此p和a没有关系了 9. p=&c[6]; //让p指向c[6],p和b又没关系了 10. cout<<*p; //输出p指向的变量值,即c[6] 11. p++; //现在p指向了c[7]; 12. p=NULL; //表示p没有指向任何变量 13. cout<<*p; //由于NULL(0)是一段无意义的地址,所以程序有可能崩溃
【例 1】 输入两个不同的数,通过指针对两个数进行相加和相乘,并输出。
1. #include<stdio.h> 2. #include<iostream> 3. using namespace std; 4. int main() 5. { 6. int a,b,s,t,*pa,*pb; 7. pa=&a;pb=&b; 8. a=10;b=20; 9. s=*pa+*pb; 10. t=*pa**pb; 11. printf("a=%d,b=%d\n",*pa,*pb); 12. printf("s=%d,t=%d",s,t); 13. return 0; 14. }
指针变量的+、-运算 指针变量的内容是内存地址,它有两个常用的运算:加、减,这两个运算一般都是配合 数组操作的。
【例 2】输入 N 个整数,使用指针变量访问输出。
1. #include<stdio.h> 2. #include<iostream> 3. using namespace std; 4. int a[101],n; 5. int main() 6. { 7. scanf("%d",&n); 8. for(int i=1;i<=n;i++) 9. scanf("%d",&a[i]); 10. int *p=&a[1];//定义指针变量int p并初始化为数组开始元素的地址 11. for(int i=1;i<=n;i++){ 12. printf("%d ",*p); 13. p++;//p指向下一个数 14. } 15. return 0; 16. }
输入:4
2 1 6 0
输出:2 1 6 0
无类型指针
有时候,一个指针根据不同的情况,指向的内容是不同类型的值,我们可以先不明确定义它的类型,只是定义一个无类型的指针,以后根据需要再用强制类型转换的方法明确它的 类型。
【例 3】无类型指针运用举例。
1. using namespace std; 2. int a=10; 3. double b=3.5; 4. void *p; 5. int main() 6. { 7. p=&a;//p的地址赋值 8. cout<<*(int*)p<<" ";//必须明确p指向的空间数据类型 9. p=&b; 10. cout<<*(double*)p<<endl; 11. return 0; 12. }
输出:10 3.5
【说明】 必须明确 p 指向的空间的数据类型,类型不一样的不仅空间大小不相同,储存的格式也不同。
如果把 cout<<*(double*)p<<endl;改成 cout<<*(long long*)p<<endl;输出的结果将 是:4615063718147915776。
多重指针
既然指针是指向其他类型的,指针本身也是一种类型。 C++允许递归地指针指向指针的指针——多重指针。
【例 4】双重指针运用举例。
1. #include<stdio.h> 2. #include<iostream> 3. using namespace std; 4. int a=10; 5. int *p; 6. int **pp; //定义双重指针 7. int main() 8. { 9. p=&a;//p的地址赋值 10. pp=&p;//将pp指向p 11. printf("%d=%d=%d\n",a,*p,**pp);//**pp通过两次间接访问了a的变量的值10 12. return 0; 13. }
输出: 10=10=10
【说明】多重指针除了可以多次“间接”访问数据,OI 上主要的应用是动态的多维数组。