课堂问题一:
#include<stdio.h> void swap(int *p,int *q) { int *m; printf("m=%d ",m); printf("%s ",*m); *m=*p; *p=*q; *q=*m; } int main() { int a,b; scanf("%d,%d",&a,&b); swap(&a,&b); printf("a=%d b=%d ",a,b); return 0; }
因为*m没有被初始化所以在直接对它进行使用的时候,它指向的是一个未知的单元格所以所以在对它它所指向的单元进行更改的时候是一种危险的操作是错误的,即使执行成功可能也是碰运气。
课堂问题二:
#include<stdio.h> void swap(int *p,int *q) { int *m; m=p; p=q; q=m; printf("p=%x q=%x ",p,q); } int main() { int a,b; scanf("%d,%d",&a,&b); swap(&a,&b); printf("a=%d b=%d ",a,b); return 0; }
我们可以理解a b m p q是几个大房间 a b 房间中存放着我们想要的东西 而p q房间中存放着a b房间的钥匙 也就是a b的地址 想要打开房间就需要地址也就是钥匙
但是在swap中用m对p q进行交换的只是a b两个房子的钥匙
把原来a 的钥匙放在了q原来在q中的b放在了p中这样 只是换了一个房子存储了钥匙既a b的地址
这样a b中存储的东西是不会发生变化的。
课堂问题三:
#include<stdio.h> int *comp(int *p,int *q) { if(*p>*q) { return p; } else { return q; } } int main() { int a=6; int b=23; int *c,*p,*q; p=&a; q=&b; c=comp(p,q); printf("a=%d b=%d ",a,b); printf("max=%d ",*c); return 0; }
指针在使用时常见的错误:
*和[]在定义的时候只是说明作用不能误解为运算符
*,[]和&是C语言提供的运算符
分别是取地址运算符、指针运算符和下标运算符,其中,&与*互为逆运算.在表达式中,它们的意义很明确,但是在定义中*、[]
只是起说明作用,不能看作运算符
指针变量未初始化
指针在使用的时候必须进行初始化,如果使用未初始化的指针,因为它没有初始化他将会得到一个不确定的值,
那么它的和指向也是不确定的,那么它就有可能指向了系统所在的地址这种操作是十分危险的。
指针类型错误
指针变量只能存储相同类型的变量的地址 如果存储的类型不同将会发生错误。
用数据直接给指针变量赋值
指针变量中存储的其实就是一些整数的地址数据,但是如果直接用数据给指针变量赋值那么编译就会出现错误。
如:
int a,*p; a=11021; p=a;
指针之间相互赋值
如果指针之前相互赋值不当会造成内存空间丢失现象
1 #include<stdio.h> 2 #include<time.h> 3 #include<windows.h> 4 5 void swap(int *a,int *b); //全局声明swap函数 6 int main和 7 { 8 int a,b,choose; //定义整型变量 用于存储a,b的值 和对选择操作提示输入值的存储 9 int *ip1,*ip2; //定义两个指针变量 用于存储a,b的地址 10 ip1=&a; 11 ip2=&b; //将a,b的地址传递给指针变量 ip1和ip2 12 srand(time(NULL)); 13 a=rand()%100+1; 14 b=rand()%100+1; //生成两个随机数并赋值给a,b 15 printf("输入‘1’对两数进行交换:"); 16 scanf("%d",&choose); //输入选择操作的提示 17 18 if(choose==1) //当输入值为1的时候 执行swap函数 19 { 20 printf("正在为您进行交换请稍后"); 21 for(int i=0;i<5;i++) 22 { 23 Sleep(1000); //模拟系统正在进行处理 Sleep(1000) 让系统暂停一秒 24 printf("."); //也起到了让系统释放内存的效果 让程序运行更加高效 25 } 26 printf(" "); 27 printf("交换前 a=%d b=%d ",a,b); 28 swap(ip1,ip2); 29 } 30 else 31 { 32 printf("输入错误退出程序!"); 33 34 exit(0); 35 } 36 37 } 38 39 void swap(int *a,int *b) //定义的swap 函数内容 40 { 41 int z; 42 z=*a; 43 *a=*b; 44 *b=z; //通过指针对a,b的进行交换 45 printf("交换后 a=%d b=%d",*a,*b); 46 }
输入‘1’对两数进行交换:1 正在为您进行交换请稍后..... 交换前 a=69 b=72 交换后 a=72 b=69
输入‘1’对两数进行交换:a 输入错误退出程序!
总结:通过生成1到100的随机数来填充a,b的值 并将a,b的地址赋给相应的指针变量
同过输入数字进行判断 是否执行后续的程序如果输入不为1将直接退出程序
如果输入正确 通过Sleep()模拟系统正在处理将调用swap函数 对a,b的值进行调换并输出