- 1、指针是什么?
- 2、指针怎么用?
- 2.1 定义指针
- 2.2 解引用
- 3、指针与函数
- 3.1 值传递
- 3.2 指针/地址传递
- 4、试一试
- (1)形参与实参同名情况
- (2)指针变量连续定义
- (3)从终端输入地址
- (4)体会变量传参和地址传参的区别
- (5)同时获得除数和余数
指针是一种保存变量地址的变量。
在计算机中每个存储单元(一个字节)都有一个编号,这个编号称为变量地址。
普通变量的值是实际值,指针变量的值是变量的地址。
取地址
我们可以在变量名前加上&,表示获取变量的地址。
int n = 10;
printf("&n=%pn",&n);
printf("n=%dn",n);
变量地址通常使用16进制表示,使用%p或者%P打印地址。
2、指针怎么用? 2.1 定义指针定义指针与定义变量的方式一样,只不过要在类型和变量名中间加上一个*星号。
类型* 指针变量;
指针变量只能使用同类型变量的地址赋值。
int n = 10;
int* p;
p = &n;
printf("&n=%pn",p);
printf("n=%dn",n);
也可以直接初始化。
int n = 10;
int* p = &n;
printf("&n=%pn",p);
printf("n=%dn",n);
2.2 解引用
指针的强大之处可以直接操作储存地址里面的数据。这种操作称为解引用。使用时需要在指针前加上星号。
**注意:这里的与声明指针的含义不一样,与乘号也不一样。**
int n = 10;
int* p = &n;
printf("n=%dn",n);
printf("*p=%dn",*p);
n = 100;
printf("n=%dn",n);
printf("*p=%dn",*p);
*p = 1000;
printf("n=%dn",n);
printf("*p=%dn",*p);
在这里对p操作就是对n操作;对n操作就是对p操作。
int func(int m){
m = 100;
}
int main(){
int n = 10;
func(n);
printf("n = %dn",n);
}
结果为:n=10
3.2 指针/地址传递int func(int* p){
*p = 100;
}
int main(){
int n = 10;
func(&n);
printf("n = %dn",n);
}
结果为:n=100
函数内部改变函数外部定义的局部变量必须满足两个条件: 指针参数 解引用4、试一试 (1)形参与实参同名情况
int func(int n){
n = 100;
}
int main(){
int n = 10;
func(n);
printf("n = %dn",n);
}
输出结果为: n=10
(2)指针变量连续定义int m,n;
m = 10;
n = 20;
int* p,q;
p = &m;
q = &n;
printf("%d %dn",*p,*q);
编译出错,指针不可以连续定义。
(3)从终端输入地址#includeint main(){ int m=0; int n=0; printf("&m=%pn",&m); printf("&n=%pn",&n); int* p; scanf("%p",&p); scanf("%d",p); printf("m=%dn",m); printf("n=%dn",n); }
首先打印出m,n的地址,然后选择一个地址对指针p进行赋值,然后输入数值,就会对此地址对应的变量值做出改变
(4)体会变量传参和地址传参的区别#include(5)同时获得除数和余数void func1(int m){ //变量名传参,不能改变变量的数值 printf("m=%dn",m); m = 100; printf("m=%dn",m); } void func2(int* p){ //传地址,可以改变变量的数值 *p = 200; } int swap1(int a,int b){ //swap交换数值,但是普通传参不能交换 printf("a=%d,b=%dn",a,b); int t =a; a =b; b=t; printf("a=%d,b=%dn",a,b); } void swap2(int* p,int* q){ //传变量的地址,用指针接受,就可以改变变量的数值 int t =*p; *p =*q; *q =t; } int main(){ int n = 10; printf("n:%dn",n);//打印初始值 func1(n); //看变量名传参是否可以改变变量的数值 printf("n:%dn",n); func2(&n); //看地址传参是否可以改变变量的数值 printf("n:%dn",n); int x = 100,y=200; printf("x=%d,y=%dn",x,y);//打印初始值 swap1(x,y);//看变量名传参是否可以改变变量的数值 printf("x=%d,y=%dn",x,y); swap2(&x,&y);//看地址传参是否可以改变变量的数值 printf("x=%d,y=%dn",x,y); }
#includeint divmod(int a,int b,int* mod){ *mod =a%b; return a/b; } int main(){ int m,n; scanf("%d%d",&m,&n); int mod; int div = divmod(m,n,&mod); printf("%d/%d=%dn",m,n,div); printf("%d%%%d=%dn",m,n,mod); }



