#include<stdio.h>
int main()
{
int *p;
int i = 5;
*p = i;(p是地址,i是值,不能把i赋给p)
printf("%d\n", *p);
return 0;
}
int *q中,q是地址,*q是值
a与b的值互换问题
基础写法(能完成互换功能)
#include <stdio.h>
void main()
{
int a = 3;
int b = 5;
int t;
t = a;
a = b;
b = t;
printf(“a = %d,b = %d”, a, b);
}
未使用指针会出现的错误写法(不能完成互换功能)
#include <stdio.h>
void huhuan(int a, int b)
{
int t;
t = a;
a = b;
b = t;
return;
}
void main()
{
int a = 3;
int b = 5;
huhuan(a, b);
printf(“a = %d,b = %d”, a, b);
}
该程序从主函数进入,把实参a发送给形参a,把b发送给形参b,但只互换了形参a和b的值,不影响主函数a和b,且执行完后形参a和b销毁,并未互换主函数a和b的值,输出的a和b指的仍然是主函数的a和b
使用指针
错误写法(未完成调换)
#include <stdio.h>
void huhuan(int * p, int * q)
{
int * t;//(如果要互换p和q的值,则t必须是int*,不能是int,否则会出错)
t = a;
a = b;
b = t;
return;
}
void main()
{
int a = 3;
int b = 5;
huhuan(&a, &b);
(//huhuan(*p, *q);是错误的
//huhuan(a, b);是错误的,因为p是地址,a是值)
printf(“a = %d,b = %d”, a, b);
}
正确做法
#include <stdio.h>
void huhuan(int * p, int * q)
{
int t;//如果要互换p和q的值,则t必须定义成int,不能定义成int*,否则语句会出错
t = * p;//p是int *;*p是int
* p = * q;
* q = t;
return;
}
void main()
{
int a = 3;
int b = 5;
huhuan(&a, &b);
printf(“a = %d,b = %d”, a, b);
}
如何通过被调函数修改主调函数普通变量的值
1.实参必须为该普通变量的地址
2.形参必须为指针变量
3.在被调函数中通过
*形参名 = ……
的方式可以修改主调函数相关变量的值
错误及正确示例:
一
#include <stdio.h>
int main()
{
int * p;//等价于int p,也等价于int p
int i = 5;
char ch = ‘A’;
p = &i;
*p = 99;
//p = &ch;(错误在类型不同不能赋值)
//p = ch;(错误)
//p = 5;(错误在p是地址,不能赋值)
printf(“i = %d,*p = %d\n”, i, *p);
return 0;
}
结果:i=99;p=99
因为&i = i
二
#include <stdio.h>
void f(int i)
{
i = 99;
}
int main()
{
int i = 6;
printf(“i = %d\n”, i);
f(i);
printf(“i = %d\n”, i);
return 0;
}
结果:i=6 i=6
三
#include <stdio.h>
int f(int i)
{
i = 99;
return i;
}
int main()
{
int i = 6;
printf(“i = %d\n”, i);
t = f(i);
printf(“i = %d\n”, t);
return 0;
}
结果:i = 6 i = 99
四
#include <stdio.h>;
void g(int * p, int * q)
{
*p = 1;
*q = 2;
}
int main()
{
int a = 3, b = 5;
g(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
答案 a=1 b=2