一、什么是指针
指针(Pointer): 变量的地址,通过它能找到以它为地址的内存单元。例子:理解指针的概念,区分什么是地址(指针),什么是地址指向的值!理解如何通过指针修改变量的值!
#include<bits/stdc++.h>
using namespace std;
int main(){
int x=10; //整数变量
int *p = &x; //定义指针(整数指针), 指向x的地址
//p是int*类型 (整数指针类型),&表示取变量的地址
cout << p << endl;
//p是地址,*p不是,*p表示p指向的地址对应的值
cout << *p << endl;
//通过指针,修改变量的值
//p指向的值,自增2
*p =*p + 2;//相当于x=x+2
cout<<x<<endl;
cout<<p<< " "<<*p<<endl;
return 0;
}
例子:对比如下代码输出的结果,理解指针和普通变量的不同;
#include<bits/stdc++.h>
using namespace std;
int main(){
int x = 10;
//值拷贝,将x的值拷贝给了y
int y=x;
y=y+2;
cout<<x<<endl;
//将x的地址拷贝给p
int *p=&x ;
*p =*p + 2;
cout<<x<<endl;
return 0;
}
例子:&和*的嵌套使用
#include<bits/stdc++.h>
using namespace std;
int main(){
int x=10;
int *p=&x ;
cout << p <<endl;
cout << *p<<endl;
cout << &(*p)<<endl;
cout << *&(*p)<< endl;
return 0;
}
例子:p++和(p)++的区别
#include<bits/stdc++.h>
using namespace std;
int main(){
int x=10;
int *p=&x;
cout << p <<" "<<*p<<endl;
//++的优先级高于*,因此*p++相当于p++;
*p++;
cout << p <<" "<<*p<<endl;
// (*p)++;
// cout << p << " "<< *p <<endl;
return 0;
}
二、 指针作用
1、在scanf中使用指针
#include<bits/stdc++.h>
using namespace std;
int main(){
//c++兼容c语言的风格
int a,b;
/*
scanf(格式,地址);
%d:整数 %f:float %lf:double %c:字符 %s:字符串 %p:指针
*/
scanf("%d",&a);
scanf("%d",&b);
//变量的输出
printf("%d",a+b);
return 0;
}
例子
#include<bits/stdc++.h>
using namespace std;
int main(){
//c++兼容c语言的风格
int a,b;
scanf("%d%d",&a,&b);
//变量的输出
printf("%d\n",a+b);
printf("%d\n",a-b);
printf("%d + %d = %d\n",a,b,a+b);
int *p = &a ;
printf("%p %d\n",p,*p);
return 0;
}
2、 函数借助指针修改变量的值
#include<bits/stdc++.h>
using namespace std;
void fun1(int x){
x++;
//cout << x << endl;
}
void fun2(int *p){
(*p)++;
}
int main(){
int x=1;
fun1(x);
cout << x<<endl;
int b=1;
fun2(&b);
cout << b << endl;
return 0;
}
三、数组指针
数组的本质就是指针
注意理解下面的结果的区别
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[3]={10,20,30};
//a的本质是a[0]的地址
cout << a << " "<< &a<< " " << &a[0]<< endl;
//定义整形的地址
int *p;
p = a;
cout << *p << endl;
(*p)++;
cout << a[0] << " "<< *p << endl;
*p++;//相当于p++ ,是地址自增,指向a[1]的值
cout << *p << endl;
return 0;
}
也可以通过指针获得数组的值
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[3]={10,20,30};
int *p;
p=a;
for(int i=0;i<3;i++){
cout << p << " ";
cout << *p << endl;
p++;//地址加加
}
return 0;
}
在函数中,通过指针输出数组元素
#include<bits/stdc++.h>
using namespace std;
void fun1(int a[],int n){//向函数中传递整数数组
for(int i=0;i<n;i++){
cout << a[i]<< " ";
}
cout << endl;
}
void fun2(int *a,int n){//函数中传递整数数组 ,直接写成指针的形式
for(int i=0;i<n;i++){
//cout << a[i]<< " ";
cout << *a << " ";
a++;
}
cout << endl;
}
void fun3(char s[]){//输出字符数组的每个字符
for(int i=0;i<strlen(s);i++){
cout << s[i]<< " ";
}
cout << endl;
}
int main(){
int a[3]={10,20,30};
char s[10]="hello";
fun1(a,3);
fun2(a,3);
fun3(s);
return 0;
}