C語(yǔ)言教程-第八講教學(xué)課件_第1頁(yè)
C語(yǔ)言教程-第八講教學(xué)課件_第2頁(yè)
C語(yǔ)言教程-第八講教學(xué)課件_第3頁(yè)
C語(yǔ)言教程-第八講教學(xué)課件_第4頁(yè)
C語(yǔ)言教程-第八講教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七講指針2020/12/101本節(jié)學(xué)習(xí)目標(biāo)指針指針與指針變量指針的聲明與使用指針與數(shù)組間的關(guān)系動(dòng)態(tài)分配內(nèi)存2020/12/102課前復(fù)習(xí)一維數(shù)組的定義與使用二維數(shù)組的定義與使用字符數(shù)組的使用2020/12/103課前練習(xí)1.若有以下定義語(yǔ)句:floata[11]={0,1,2,3,4,5,6,7,8,9,10}以下描述錯(cuò)誤的是()A)a數(shù)組在內(nèi)存中占44個(gè)字節(jié).B)a數(shù)組的最后一個(gè)元素是a[10].C)a數(shù)組的第一個(gè)元素是a[0]D)以上定義語(yǔ)句給a數(shù)組所賦初始值是整數(shù),因此不能正確賦初始值.2020/12/104數(shù)據(jù)的存儲(chǔ)機(jī)制內(nèi)存地址—內(nèi)存中存儲(chǔ)單元的編號(hào)。變量地址—系統(tǒng)標(biāo)識(shí)變量在內(nèi)存中的起始位置。2020/12/105數(shù)據(jù)的存儲(chǔ)機(jī)制(續(xù))直接訪問(wèn)#include<stdio.h>voidmain(){ inta,b,sum; printf("請(qǐng)輸入a和b的值:"); scanf("%d,%d",&a,&b); sum=a+b; printf("sum=%d\n",sum);}間接訪問(wèn)#include<stdio.h>voidmain(){ inta,b,sum=0; int*p_1,*p_2; printf("請(qǐng)輸入a和b的值:"); scanf("%d,%d",&a,&b); p_1=&a; p_2=&b; sum=*p_1+*p_2; printf("sum=%d\n",sum);}2020/12/106指針的功能方便一個(gè)函數(shù)向另一個(gè)函數(shù)的過(guò)渡。能通過(guò)指針的移動(dòng)來(lái)改變指針?biāo)赶虻臄?shù)據(jù),不需要去移動(dòng)變量或數(shù)組??梢詫?shí)現(xiàn)動(dòng)態(tài)內(nèi)存的更新。2020/12/107指針與指針變量什么是指針?變量的內(nèi)存地址。指針變量用來(lái)存放變量地址的變量。56a變量名1000(內(nèi)存地址)變量值1000b指針指針變量2020/12/108指針聲明格式數(shù)據(jù)類型*指針變量名;2020/12/109聲明注意事項(xiàng)“*”表示聲明的指針變量,不是代表指針運(yùn)算符。“*”前必須指定數(shù)據(jù)類型(基類型),其主要功能是指指針?biāo)赶驅(qū)ο蟮臄?shù)據(jù)類型?;愋停褐羔?biāo)赶虻臄?shù)據(jù)類型。決定了指針每次移動(dòng)的步長(zhǎng)。2020/12/1010指針的賦值與引用指針運(yùn)算符&——求址運(yùn)算符(……的地址)*——指針運(yùn)算符(……地址中的值)2020/12/1011范例inta=10;int*p;p=&a;ap1010100inta=10,int*pp=&a地址地址1001041001042020/12/1012指針賦值2-1通過(guò)&運(yùn)算符為指針賦值 ptr_var=&var;通過(guò)另一個(gè)指向相同類型數(shù)據(jù)項(xiàng)的指針變量對(duì)指針進(jìn)行賦值 ptr_var2=ptr_var;2020/12/1013指針賦值2-2通過(guò)指針為變量賦值

*ptr_var=10;如果ptr_var指向var,則把10賦給var2020/12/1014課堂練習(xí)寫(xiě)出下列計(jì)算結(jié)果inta=5;/*a的內(nèi)存地址為3000*/ int*p; p=&a;(1):p; (2)&p (3)*p(4):a (5)&a2020/12/1015課堂練習(xí)寫(xiě)出下列計(jì)算結(jié)果intnum1=2,num2,*pnt;pnt=&num1;num2=*pnt;(1)num1 (2)num2 (3)*pnt

2020/12/1016數(shù)組指針與數(shù)組的指針變量什么是數(shù)組指針?數(shù)組在內(nèi)存中的地址。數(shù)組的指針變量存放數(shù)組元素地址的變量。2020/12/1017使用指針引用數(shù)組元素?cái)?shù)組的方法#include<stdio.h>voidmain(){ inta[5]={6,7,8,9,10}; inti; for(i=0;i<5;i++) { printf("a[%d]:%d\n",i,a[i]); }}指針的方法#include<stdio.h>voidmain(){ inta[5]={6,7,8,9,10}; int*p; for(p=a;p<a+5;p++) { printf("%d\n",*p); }}2020/12/1018使用指針變量的注意事項(xiàng)只能進(jìn)行加法和減法運(yùn)算 intvar,*ptr_var; ptr_var=&var; ptr_var++;假定var存儲(chǔ)在地址1000中,因?yàn)檎麛?shù)的長(zhǎng)度是2個(gè)字節(jié),ptr_var的值將是10022020/12/1019指針運(yùn)算2-2指針遞增時(shí),將指向其類型的下一個(gè)元素的內(nèi)存位置,反之亦然操作意義++ptr_var或ptr_var++指向var后面的下一個(gè)整數(shù)--ptr_var或ptr_var--指向var前面的整數(shù)ptr_var+i指向var后面的第i個(gè)整數(shù)ptr_var-i指向var前面的第i個(gè)整數(shù)++(*ptr_var)或(*ptr_var)++將var的值加1*(ptr_var++)取出var后面的下一個(gè)整數(shù)的值2020/12/1020課堂練習(xí)1.若有定義:intx,*pb;則以下正確的賦值表達(dá)式是()A)pb=&xB)pb=xC)*pb=&xD)*pb=*x2.若p和q已正確定義,并指向同一連續(xù)單元如下,請(qǐng)回答如下問(wèn)題:a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]

p^q^10203040506070802020/12/1021課堂練習(xí)a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]p^q^1.表達(dá)式*p-*q的值是___.2.表達(dá)式*++p的值是__.指針p是否移動(dòng)__.3.表達(dá)式--*q的值是__.指針q是否移動(dòng)___.4.表達(dá)式*--q的值是__.指針q是否移動(dòng)___.5.表達(dá)式++*p的值是__.指針p是否移動(dòng)___.6.表達(dá)式(*p)--的值是__.指針p是否移動(dòng)___.7.表達(dá)式*q--的值是__.指針q是否移動(dòng)____,*q的值是_.10203040506070802020/12/1022例題輸入兩個(gè)數(shù),按從大到小的順序排列。#include<stdio.h>voidmain(){ inta,b; int*p_1,*p_2,*max; p_1=&a;p_2=&b; printf("請(qǐng)輸入a和b的數(shù):"); scanf("%d,%d",&a,&b); if(a<b) { max=p_1;p_1=p_2;p_2=max; } printf("%d,%d\n",*p_1,*p_2);}2020/12/1023指針與一維數(shù)組3-1數(shù)組元素的地址可以用兩種方式表示在數(shù)組元素前面加“&”符號(hào) &ary[2]數(shù)組名+下標(biāo) ary+22020/12/1024指針與一維數(shù)組3-2#include<stdio.h>voidmain(){staticintary[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i<10;i++){printf(“\ni=%d,ary月[i]=%d,*(ary+i)=%d",i,ary[i],*(ary+i));printf("&ary[i]=%X,ary+i=%X",&ary[i],ary+i);}}值地址2020/12/1025指針與一維數(shù)組3-3演示:執(zhí)行程序,觀察并分析輸出結(jié)果2020/12/1026課堂練習(xí)#include<stdio.h>voidmain(){ inta[5]; inti; for(i=0;i<5;i++) { printf("請(qǐng)輸入第%d個(gè)數(shù):",(i+1)); scanf("%d",&a[i]); }//給數(shù)組賦值 printf("\n"); for(i=4;i>=0;i--) { printf("a[%d]=%d\n",i,a[i]); } }2020/12/1027課堂練習(xí)#include<stdio.h>voidmain(){ inta[5]; inti; for(i=0;i<5;i++) { printf("請(qǐng)輸入第%d個(gè)數(shù):",(i+1)); scanf("%d",a+i); }//給數(shù)組賦值 printf("\n"); for(i=4;i>=0;i--) { printf("a[%d]=%d\n",i,*(a+i)); } }2020/12/1028課堂練習(xí)#include<stdio.h>voidmain(){ inta[5]; inti; int*p; for(i=0;i<5;i++) { printf("請(qǐng)輸入第%d個(gè)數(shù):",(i+1)); scanf("%d",a+i); }//給數(shù)組賦值 printf("\n"); for(p=a+4;p>=a;p--) { printf("a[%d]=%d\n",i,*p); } }2020/12/1029注意事項(xiàng)可以通過(guò)指針將一個(gè)數(shù)組元素賦給另一個(gè)數(shù)組元素,但不能將一個(gè)數(shù)組元素的地址賦給另一個(gè)數(shù)組元素。Ary[2]=ary[3];&ary[2]=&ary[3];2020/12/1030指針與多維數(shù)組二維數(shù)組可以定義為一個(gè)指向一組連續(xù)的一維數(shù)組的指針 數(shù)據(jù)類型(*變量名)[常量表達(dá)式];pP+1P+2P+3例如:int(*p)[8]2020/12/1031范例#include<stdio.h>voidmain(){ inta[2][3]={1,2,3,4,5,6}; printf("%d\n",*(*(a+1)+2));}2020/12/1032指針與字符串2-1#include<stdio.h>voidmain(){ charary[10]="chinese"; char*p; p=ary+2; printf("%c",*p);}2020/12/1033指針與字符串2-2#include<stdio.h>#include<string.h>voidmain(){ chara,str[81],*ptr; printf("\nEnterasentence:"); gets(str);//輸入一個(gè)字符串 printf("\nEntercharactertosearchfor:"); a=getche();//輸入要查找字符 ptr=strchr(str,a); /*returnpointertochar*/ printf("\nStringstartsataddress:%u",str); printf("\nFirstoccurrenceofthecharacterisat:%u",ptr); printf(“\nPositionoffirstoccurrenceis:%d”,ptr-str);}指針運(yùn)算Strchr()函數(shù):計(jì)算指定字符在字符串中第一次出現(xiàn)的地址。2020/12/1034分配內(nèi)存2-1malloc()是最常用的函數(shù)之一它允許從空閑內(nèi)存池中分配內(nèi)存malloc()的參數(shù)是代表所需字節(jié)數(shù)的整數(shù)2020/12/1035分配內(nèi)存2-2#include<stdio.h>#include<malloc.h>voidmain(){

int*p,n,i,j,temp; printf("\nEnternumberofelementsinthearray:"); scanf("%d",&n); p=(int*)malloc(n*sizeof(int)); for(i=0;i<n;++i){ printf("\nEnterelementno.%d:",i+1); scanf("%d",p+i); } for(i=0;i<n-1;++i) for(j=i+1;j<n;++j) if(*(p+i)>*(p+j)){ temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; } for(i=0;i<n;++i) printf("%d\n",*(p+i));}分配內(nèi)存排序2020/12/1036free()函數(shù)3-1使用free()函數(shù)釋放不再需要的內(nèi)存

ptr必須是通過(guò)malloc()、calloc()或realloc()分配的指針voidfree(void*ptr);2020/12/1037free()函數(shù)3-2#include<stdio.h>#include<stdlib.h>intmain(){intnumber;

int*ptr;inti;printf("Howmanyints?");scanf("%d",&number);

ptr=(int*)malloc(number*sizeof(int));if(ptr!=NULL){ for(i=0;i<number;i++) { *(ptr+i)=i; } for(i=number;i>0;i--) { printf("%d\n",*(ptr+(i-1))); }

free(ptr); return0;}else{ printf("\nMemoryallocationfailed.\n"); return1;}}定義分配判斷釋放2020/12/1038free()函數(shù)3-3演示:執(zhí)行程序,觀察并分析輸出結(jié)果2020/12/1039calloc()函數(shù)3-1calloc()與malloc()類似主要的區(qū)別是存儲(chǔ)在已分配的內(nèi)存空間中的值默認(rèn)為零calloc()需要兩個(gè)參數(shù)要分配內(nèi)存的變量的個(gè)數(shù)每個(gè)變量的大小 void*calloc(size_tnum,size_tsize);2020/12/1040calloc()函數(shù)3-2#include<stdio.h>#include<stdlib.h>intmain(){float*calloc1,*calloc2;inti;calloc1=(float*)calloc(3,sizeof(float));calloc2=(float*)calloc(3,sizeof(float));if(calloc1!=NULL&&calloc2!=NULL){for(i=0;i<3;i++){printf("\ncalloc1[%d]holds%05.5f",i,calloc1[i]);printf("\ncalloc2[%d]holds%05.5f",i,*(calloc2+i));}free(calloc1);free(calloc2);return0;}else{printf("Notenoughmemory

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論