指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數(shù)據(jù)結構; 能很方便地使用數(shù)組和字符串; 并能象匯編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。 學習指針是學習C語言中最重要的一環(huán), 能否正確理解和使用指針是我們是否掌握C語言的一個標志。同時, 指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。
指針的基本概念 在計算機中,所有的數(shù)據(jù)都是存放在存儲器中的。 一般把存儲器中的一個字節(jié)稱為一個內存單元, 不同的數(shù)據(jù)類型所占用的內存單元數(shù)不等,如整型量占2個單元,字符量占1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些內存單元, 必須為每個內存單元編上號。 根據(jù)一個內存單元的編號即可準確地找到該內存單元。內存單元的編號也叫做地址。 既然根據(jù)內存單元的編號或地址就可以找到所需的內存單元,所以通常也把這個地址稱為指針。 內存單元的指針和內存單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關系。我們到銀行去存取款時, 銀行工作人員將根據(jù)我們的帳號去找我們的存款單, 找到之后在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針, 存款數(shù)是存單的內容。對于一個內存單元來說,單元的地址即為指針, 其中存放的數(shù)據(jù)才是該單元的內容。在C語言中, 允許用一個變量來存放指針,這種變量稱為指針變量。因此, 一個指針變量的值就是某個內存單元的地址或稱為某內存單元的指針。圖中,設有字符變量C,其內容為“K”(ASCII碼為十進制數(shù) 75),C占用了011A號單元(地址用十六進數(shù)表示)。設有指針變量P,內容為011A, 這種情況我們稱為P指向變量C,或說P是指向變量C的指針。 嚴格地說,一個指針是一個地址, 是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變。 但在常把指針變量簡稱為指針。為了避免混淆,我們中約定:“指針”是指地址, 是常量,“指針變量”是指取值為地址的變量。 定義指針的目的是為了通過指針去訪問內存單元。
既然指針變量的值是一個地址, 那么這個地址不僅可以是變量的地址, 也可以是其它數(shù)據(jù)結構的地址。在一個指針變量中存放一
個數(shù)組或一個函數(shù)的首地址有何意義呢? 因為數(shù)組或函數(shù)都是連續(xù)存放的。通過訪問指針變量取得了數(shù)組或函數(shù)的首地址, 也就找到了該數(shù)組或函數(shù)。這樣一來, 凡是出現(xiàn)數(shù)組,函數(shù)的地方都可以用一個指針變量來表示, 只要該指針變量中賦予數(shù)組或函數(shù)的首地址即可。這樣做, 將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中, 一種數(shù)據(jù)類型或數(shù)據(jù)結構往往都占有一組連續(xù)的內存單元。 用“地址”這個概念并不能很好地描述一種數(shù)據(jù)類型或數(shù)據(jù)結構, 而“指針”雖然實際上也是一個地址,但它卻是一個數(shù)據(jù)結構的首地址, 它是“指向”一個數(shù)據(jù)結構的,因而概念更為清楚,表示更為明確。 這也是引入“指針”概念的一個重要原因。
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供巴馬網(wǎng)站建設、巴馬做網(wǎng)站、巴馬網(wǎng)站設計、巴馬網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、巴馬企業(yè)網(wǎng)站模板建站服務,10年巴馬做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
應用指針的信息管理系統(tǒng):
#include
#include
#include
#include
#define N 3
typedef struct node
{
char name[20];
struct node *link;
}stud;
stud * creat(int n) /*建立單鏈表的函數(shù)*/
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配內存空間!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i { if((s= (stud *) malloc(sizeof(stud)))==NULL) { printf("不能分配內存空間!"); exit(0); } p->link=s; printf("請輸入第%d個人的姓名:",i+1); scanf("%s",s->name); s->link=NULL; p=s; } return(h); } stud * search(stud *h,char *x) /*查找函數(shù)*/ { stud *p; char *y; p=h->link; while(p!=NULL) { y=p->name; if(strcmp(y,x)==0) return(p); else p=p->link; } if(p==NULL) printf("沒有查找到該數(shù)據(jù)!"); } stud * search3(stud *h,char *x) /*另一個查找函數(shù),返回的是上一個查找函數(shù)的直接前驅結點的指針, h為表頭指針,x為指向要查找的姓名的指針 其實此函數(shù)的算法與上面的查找算法是一樣的,只是多了一個指針s,并且s總是指向指針p所指向的結點的直接前驅, 結果返回s即是要查找的結點的前一個結點*/ { stud *p,*s; char *y; p=h->link; s=h; while(p!=NULL) { y=p->name; if(strcmp(y,x)==0) return(s); else { p=p->link; s=s->link; } } if(p==NULL) printf("沒有查找到該數(shù)據(jù)!"); } void insert(stud *p) /*插入函數(shù),在指針p后插入*/ { char stuname[20]; stud *s; /*指針s是保存新結點地址的*/ if((s= (stud *) malloc(sizeof(stud)))==NULL) { printf("不能分配內存空間!"); exit(0); } printf("請輸入你要插入的人的姓名:"); scanf("%s",stuname); strcpy(s->name,stuname); /*把指針stuname所指向的數(shù)組元素拷貝給新結點的數(shù)據(jù)域*/ s->link=p->link; /*把新結點的鏈域指向原來p結點的后繼結點*/ p->link=s; /*p結點的鏈域指向新結點*/ } void del(stud *x,stud *y) /*刪除函數(shù),其中y為要刪除的結點的指針,x為要刪除的結點的前一個結點的指針*/ { stud *s; s=y; x->link=y->link; free(s); } void print(stud *h) { stud *p; p=h->link; printf("數(shù)據(jù)信息為:\n"); while(p!=NULL) { printf("%s \n",&*(p->name)); p=p->link; } } void quit() { exit(0); } void menu(void) { system("cls"); printf("\t\t\t單鏈表C語言實現(xiàn)實例\n"); printf("\t\t|--------------------|\n"); printf("\t\t| |\n"); printf("\t\t| [1] 建 立 新 表 |\n"); printf("\t\t| [2] 查 找 數(shù) 據(jù) |\n"); printf("\t\t| [3] 插 入 數(shù) 據(jù) |\n"); printf("\t\t| [4] 刪 除 數(shù) 據(jù) |\n"); printf("\t\t| [5] 打 印 數(shù) 據(jù) |\n"); printf("\t\t| [6] 退 出 |\n"); printf("\t\t| |\n"); printf("\t\t| 如未建立新表,請先建立! |\n"); printf("\t\t| |\n"); printf("\t\t|-------------------|\n"); printf("\t\t 請輸入你的選項(1-6):"); } main() { int choose; stud *head,*searchpoint,*forepoint; char fullname[20]; while(1) { menu(); scanf("%d",&choose); switch(choose) { case 1: head=creat(N); break; case 2: printf("輸入你所要查找的人的姓名:"); scanf("%s",fullname); searchpoint=search(head,fullname); printf("你所查找的人的姓名為:%s",*&searchpoint->name); printf("\n按回車鍵回到主菜單。"); getchar();getchar(); break; case 3: printf("輸入你要在哪個人后面插入:"); scanf("%s",fullname); searchpoint=search(head,fullname); printf("你所查找的人的姓名為:%s",*&searchpoint->name); insert(searchpoint); print(head); printf("\n按回車鍵回到主菜單。"); getchar();getchar(); break; case 4: print(head); printf("\n輸入你所要刪除的人的姓名:"); scanf("%s",fullname); searchpoint=search(head,fullname); forepoint=search3(head,fullname); del(forepoint,searchpoint); break; case 5: print(head); printf("\n按回車鍵回到主菜單。"); getchar();getchar(); break; case 6:quit(); break; default: printf("你輸入了非法字符!按回車鍵回到主菜單。"); system("cls"); menu(); getchar(); } } } 心得體會: 堂上要講授許多關于c語言的語法規(guī)則,聽起來十分枯燥無味,也不容易記住,死記硬背是不可取的。然而要使用c語言這個工具解決實際問題,又必須掌握它。通過多次上機練習,對于語法知識有了感性的認識,加深對它的理解,在理解的基礎上就會自然而然地掌握c語言的語法規(guī)定。對于一些內容自己認為在課堂上聽懂了,但上機實踐中會發(fā)現(xiàn)原來(轉載自第。)理解的偏差,這是由于大部分學生是初次接觸程序設計,缺乏程序設計的實踐所致。 學習c語言不能停留在學習它的語法規(guī)則,而是利用學到的知識編寫c語言程序,解決實際問題。即把c語言作為工具,描述解決實際問題的步驟,由計算機幫助我們解題。只有通過上機才能檢驗自己是否掌握c語言、自己編寫的程序是否能夠正確地解題。 通過上機實驗來驗證自己編制的程序是否正確,恐怕是大多數(shù)同學在完成老師作業(yè)時的心態(tài)。但是在程序設計領域里這是一定要克服的傳統(tǒng)的、錯誤的想法。因為在這種思想支配下,可能你會想辦法去"掩蓋"程序中的錯誤,而不是盡可能多地發(fā)現(xiàn)程序中存在的問題。自己編好程序上機調試運行時,可能有很多你想不到的情況發(fā)生,通過解決這些問題,可以逐步提高自己對c語言的理解和程序開發(fā)能力。
文章名稱:C語言的關于指針的學習
URL標題:http://weahome.cn/article/pejpec.html