?課堂問題一:
#include<stdio.h>void swap(int *p,int *q) {int *m;printf("m=%d\n",m);printf("%s\n",*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\n",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\n",p,q);} int main(){int a,b;scanf("%d,%d",&a,&b);swap(&a,&b);printf("a=%d b=%d\n",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\n",a,b);printf("max=%d\n",*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("\n"); 27 printf("交換前 a=%d\tb=%d\n",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\tb=%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的值進行調換并輸出
?