




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
會計學1C語言程序設計第指針程序設計7.1指針概述指針與指針變量變量的直接訪問和間接訪問第1頁/共48頁7.1指針概述指針與指針變量某個變量所占用的內存空間的開始地址稱為該變量的地址,C語言將這一地址稱為指針,存儲這一地址的變量稱為指針變量。通過指針變量可以實現對其他變量的訪問。指針變量可以指向任何一種數據類型,如可以指向基本類型的變量,也可以指向數組等。第2頁/共48頁7.1指針概述變量直接訪問是指通過變量名直接使用變量數據。例如:inta=10,b=20,c;c=a+b;printf("%d\n",c);變量間接訪問是指通過指針變量去訪問其他變量數據。第3頁/共48頁7.2指針變量的定義和使用7.2.1指針變量程序示例7.2.2定義指針變量7.2.3使用指針變量第4頁/共48頁7.2.1指針變量程序示例例7-1
使用指針變量輸出數據程序。#include<stdio.h>intmain(void){ inta=2008;
int*p;
p=&a; printf("%d\n",*p);
return0;}定義指針變量p指向a
用*p表示變量a的值第5頁/共48頁7.2.2定義指針變量一般格式
數據類型*指針變量名1,*指針變量名2,┅;例如:int
*p1,*p2;
float
*q;指針變量允許和其他變量同時定義:
charm,n,*p,*q;注意“數據類型”是指針變量要指向的變量的數據類型。第6頁/共48頁7.2.3使用指針變量1.指針變量的初始化一般格式
數據類型*指針變量名1=地址1,*指針變量名2=地址2,┅;
例如:intm;
int*p=&m;2.指針變量的賦值一般格式
指針變量=變量地址;例如:intm=196,*p,*q;
p=&m;
q=p;
pm&m
p196&mq第7頁/共48頁7.2.3使用指針變量3.使用指針變量輸入數據當指針變量有了確切的指向目標后,即可使用該指針變量為指向的目標輸入數據。
intscore,*p;p=&score;scanf("%d",p);scanf語句的功能與下列語句等價:
scanf("%d",&score);
第8頁/共48頁7.2.3使用指針變量4.指向運算“*”與目標訪問對于指針變量p,訪問其指向的變量時,使用“*”運算符:*p例如,對上面的程序段,輸出變量score的數據:
printf("%d",*p);其中,*p表示p指向的目標score。第9頁/共48頁例7-2定義指針變量p1、p2,并任意輸入兩個整數a、b,使得p1指向其中的較大值,p2指向其中的較小值。#include<stdio.h>intmain(){
int*p1,*p2,*p,a,b; printf("Input:"); scanf("%d,%d",&a,&b);
p1=&a; p2=&b; if(a<b){p=p1;p1=p2;p2=p;} printf("Output:"); printf("%d,%d\n",*p1,*p2);return0;}7.2.2使用指針變量第10頁/共48頁7.3指針與數組7.3.1指針與一維數組7.3.2指針與二維數組7.3.3指針與字符串7.3.4指針數組第11頁/共48頁7.3.1指針與一維數組主要內容如何把一個指針和一維數組關聯起來,即怎樣使指針指向一維數組如何使用指針訪問一維數組的元素要解決的問題用指針實現一維數組的數據處理
第12頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.3.1用指針訪問一維數組1.指針與一維數組的關系
對于長度是N的一維數組a,當使用指針p指向其首元素后,即可通過指針p訪問數組的各個元素。簡單類型數組aa[0]用*p表示a[1]用*(p+1)表示a[i]用*(p+i)表示指向一位數組的指針變量第13頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.3.1用指針訪問一維數組2.定義和使用指向一維數組的指針變量若有定義:inta[N],*p;/*N為符號常量*/則以下任何語句都能使指針變量p指向一維數組ap=a;p=&a[0];當指針變量p指向a數組之后,就可以使用p訪問a數組的元素。例如,可以使用下面的語句輸出元素a[0]和a[1]的值。printf(“%d,%d”,*p,*(p+1));第14頁/共48頁7.3.1用指針訪問一維數組例7-3
用指針實現一維數組的輸入輸出。
程序一#include<stdio.h>#defineN10intmain(){inta[N];int*p=a,i;for(i=0;i<N;i++)scanf("%d",p+i);for(i=0;i<N;i++)printf("%d",*(p+i));return0;}
&a[i]a[i]第15頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.3.1用指針訪問一維數組例7-3
用指針實現一維數組的輸入輸出。
程序二#include<stdio.h>#defineN10intmain(){inta[N];int*p=a,i;for(i=0;i<N;i++)scanf("%d",p++);p=a;for(i=0;i<N;i++)printf("%d",*p++);
return0;}&a[i]a[i]第16頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.3.1用指針訪問一維數組例7-3
用指針實現一維數組的輸入輸出。
程序三#include<stdio.h>#defineN10intmain(void){inta[N],*p;for(p=a;p<(a+N);p++)scanf("%d",p);for(p=a;p<(a+N);p++)printf("%d",*p);return0;}&a[i]a[i]第17頁/共48頁7.3.1用指針訪問一維數組例7-4用指針法訪問數組,求得一維數組元素的最大值。#include<stdio.h>#defineN10intmain(void){ inta[N],i,max,*p; p=a; printf("Data:"); for(i=0;i<N;i++) scanf("%d",p+i);
max=*p; for(i=1;i<N;i++)
if(max<*(p+i))
max=*(p+i); printf("Max:%d\n",max); return0;}第18頁/共48頁7.3.2指針與二維數組主要內容如何把一個指針和二維數組關聯起來,即怎樣使指針指向二維數組如何使用指針訪問二維數組的元素要解決的問題用指針實現二維數組的數據處理
第19頁/共48頁7.3.2指針與二維數組102030408070605018273645回顧二維數組的存儲
10a[0][0]20a[0][1]30a[0][2]40a[0][3]80a[1][0]70a[1][1]60a[1][2]50a[1][3]18a[2][0]27a[2][1]36a[2][2]45a[2][3]inta[3][4];
pp+1p+2p+3p+4p+5p+6p+7p+8p+9p+10p+11如何使p指向首元素?a[i][j]的指針如何表示?
問題第20頁/共48頁7.3.2指針與二維數組指針和二維數組元素的對應關系設p是指針變量,若有:p=a[0];則p+j將指向a[0]數組中的元素a[0][j]。由于a[0]、a[1]、┅、a[M-1]等各個行數組依次連續存儲,則對于a數組中的任一元素a[i][j],指針的一般形式如下:p+i*N+j元素a[i][j]相應的指針表示為:*(p+i*N+j)a[i][j]也可用指針下標法表示:p[i*N+j]第21頁/共48頁7.3.2指針與二維數組舉例inta[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};int*p=a[0];則數組a的元素a[1][2]對應的指針為:p+1*4+2元素a[1][2]也就可以表示為:*(p+1*4+2)用下標表示法,a[1][2]表示為:p[1*4+2]第22頁/共48頁7.3.2指針與二維數組例7-5用指針訪問二維數組的方法,求二維數組元素的最大值。#include<stdio.h>intmain(void){ inta[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int*p,max; for(p=a[0],max=*p;p<a[0]+12;p++) if(*p>max) max=*p; printf("Max=%d\n",max);return0;}第23頁/共48頁7.3.3指針與字符串使字符型指針變量指向字符串的方法⑴定義指針變量時初始化指向字符串。 char*p="astring";⑵使指針變量指向字符型數組,從而使其指向字符串。 charname[20],*str; gets(name); str=name;第24頁/共48頁7.3.3指針與字符串例7-6從鍵盤輸入一個字符串,統計其中的數字字符個數。#include<stdio.h>#defineN100intmain(void){charstr[N],*p;intcount;p=str;gets(p);for(count=0;*p!='\0';p++)if(*p>='0'&&*p<='9')count++;printf("Total:%d\n",count);return0;}
第25頁/共48頁7.3.4指針數組數組元素為指針類型的數組稱為指針數組,指針數組中的每一個元素都是指針變量。一維指針數組的定義形式如下:
數據類型*數組名[數組長度];例:
char*days[7];該語句定義了一個名為days的字符型指針數組,其每一個元素都是指向char變量的指針變量。指針數組的每個元素是指針變量,只能存放地址,所以對指向字符串的指針數組賦初值時,要把存放字符串的首地址賦給指針數組的對應元素。例:char*days[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};第26頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.3.4指針數組指針數組元素days[0]days[1]days[2]days[3]days[4]days[5]days[6]字符串SundayMondayTuesdayWednesdayThursdayFridaySaturdaychar*days[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};第27頁/共48頁7.3.4指針數組char*days[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};例7-7
分行輸出days數組指向的字符串。#include<stdio.h>intmain(){ inti; char*days[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; for(i=0;i<7;i++) puts(days[i]);return0;}第28頁/共48頁7.4指針作函數的參數7.4.1簡單變量指針作函數參數7.4.2指向數組的指針作函數的參數7.4.3字符串指針作函數的參數7.4.4指針數組作函數的參數第29頁/共48頁實參:簡單變量地址voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}7.4.1簡單變量指針作函數參數形參:指針變量#include<stdio.h>intmain(){voidswap(int*,int*);intx,y;scanf("%d,%d",&x,&y);if(x<y)
swap(&x,&y);
printf("%d,%d\n",x,y);return0;}
例7-8任意輸入兩個整數,然后按照先大后小的順序將其輸出。簡單變量指針作函數參數,實現簡單變量的地址在函數中的傳遞。第30頁/共48頁7.4.1簡單指針變量作函數參數例7-9
用比較交換法,將一維數組的最大值移到數組的最末元素位置,交換過程用上述swap()函數實現。#include<stdio.h>intmain(){ voidswap(int*,int*); inti,a[10]={33,-12,97,3,7,18,9,51,10,9}; for(i=0;i<9;i++) if(a[i]>a[i+1])
swap(&a[i],&a[i+1]);
for(i=0;i<10;i++) printf("%5d",a[i]); printf("\n");return0;}voidswap(int*p1,int*p2){ inttemp; temp=*p1; *p1=*p2; *p2=temp;}
第31頁/共48頁7.4.2指向數組的指針作函數的參數例7-10設計求一維數組元素最大值的函數pv_max(),并在主函數中調用它求數組元素最大值
。問題分析與算法設計為了方便函數編寫,先假定數組長度為n,指針p指向該數組。⑴設計pv_max()函數原型:intpv_max(int*p,intn)
功能:在長度為n、由p指向的一維數組中求元素最大值。⑵用main()函數作為主控函數。第32頁/共48頁7.4.2指向數組的指針作函數的參數intpv_max(int*p,intn){inti,max=*p;for(i=1;i<n;i++)if(*(p+i)>max) max=*(p+i);returnmax;}
#include<stdio.h>#defineN10intmain(void){intpv_max(int*,int);inta[N],i;for(i=0;i<N;i++)scanf("%d",&a[i]);printf("Max=%d\n",pv_max(a,N));return0;}
第33頁/共48頁7.4.3字符串指針作函數參數字符串指針作函數的參數,與前面介紹的數組指針作函數參數沒有本質的區別,函數間傳遞的都是地址值,所不同的僅是指針指向對象的類型不同而已。例7-11改寫例7-6的程序,將統計數字字符的過程改由用戶函數實現,要求字符串指針作函數參數。第34頁/共48頁7.4.3字符串指針作函數參數#include<stdio.h>#defineN100intmain(void){ charstring[N];
intcount_p(char*);
gets(string);
printf("Total:%d\n",count_p(string));
return0;}intcount_p(char*p){ intcount;
for(count=0;*p!='\0';p++) if(*p>='0'&&*p<='9')count++; returncount;}
形參:字符串指針實參:字符數組名第35頁/共48頁7.4.4指針數組作函數的參數指針數組的元素是指針變量,用指針數組能夠實現一組字符串的處理。當用指針數組作函數參數時,就可設計通用的多字符串操作函數。第36頁/共48頁7.4.4指針數組作函數的參數#include<stdio.h>#include<string.h>intmain(){voidstring_sort(char*[],int); voidstring_out(char*[],int);char*days[7]={"Sunday","Monday","Tuesday","Wednesday",Thursday",Friday","Saturday"};string_sort(days,7);string_out(days,7);return0;}voidstring_out(char*string[],intn){inti;for(i=0;i<n;i++)printf("%s",string[i]);}voidstring_sort(char*string[],intn){char*temp;inti,j;for(i=1;i<n;i++){for(j=0;j<n-i;j++)
if(strcmp(string[j],string[j+1])>0){temp=string[j];string[j]=string[j+1];string[j+1]=temp;}}}例7-13編寫能對多個字符串排序的函數,并調用該函數將一組字符串按字典順序排序。第37頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.5指針函數函數返回值是指針類型的函數稱為指針函數
指針函數的定義的一般格式數據類型*函數名(形參表){
函數體}函數體中的return命令須返回一個地址值第38頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.5指針函數例7-14編寫能夠查找長度最大的字符串的函數,并調用該函數求一組字符串中的最長字符串。問題分析與算法設計⑴設計查找最長字符串的函數max_len(),其原型如下:char*max_len(char*string[],intn)其中,string為指向字符串的指針數組,n為字符串個數。函數功能:在string指向的n個字符串中查找最長字符串,返回該字符串的地址。⑵設計主函數,其功能包括:通過指針數組提供一組字符串;調用函數max_len()求得最長字符串,并輸出結果。第39頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.5指針函數#include<stdio.h>#include<string.h>intmain(){char*max_len(char*[],int);char*p_string[4]={"Sydney2000","Beijing2008","Athens1996","Korea1992"};puts(max_len(p_string,4));
return0;}char*max_len(char*string[],intn)
{inti,posion,max_l;posion=0;max_l=strlen(string[0]);for(i=1;i<n;i++)if(strlen(string[i])>max_l){max_l=strlen(string[i]);posion=i;}return(string[posion]);
}字符串指針數組字符串個數存儲字符串地址的數組名返回最長字符串的首地址第40頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.6指針應用舉例“學生成績分等統計”進一步函數化三色球問題第41頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.6指針應用舉例例7-15
將例6-16的“學生成績分等統計”程序進一步函數化,把輸出統計結果的過程改由函數實現。問題分析與算法設計⑴定義一維數組的輸出函數output()函數原型:voidoutpu(int*p,intn)其中,p為指向一維數組的指針,n為元素個數。函數功能:將指針變量p指向的一維數組的全部n個元素輸出。⑵在例6-16的程序中,使用一維數組r存儲各等級的統計結果,本程序仍然使用數組r存儲統計結果。輸出r數組各個元素的過程,通過調用output()函數實現,調用形式為output(r,5)。實現程序第42頁/共48頁C語言程序設計-理論方法與實踐(第2版)7.6指針應用舉例#include<stdio.h>#defineN6intmain(void){intflag(int,int);
voidoutput(int*,int);
ints1,s2,i;staticintr[5];for(i=0;i<N;i++)
{scanf("%d%d",&s1,&s2);r[flag(s1,s2)]++;}
output(r,5);
return0;}
intflag(intx,inty){intave;ave=(x+y)/2;if(ave>=90)return0;elseif(ave>=80)return1;elseif(ave>=70)return2;elseif(ave>=60)return3;elsereturn4;}
voidoutput(int*p,intn){inti;for(i=0;i<n;i++)printf("%d",*(p+i));}
第43頁/共48頁7.6指針應用舉例例7-16
有紅、黃、藍、白、黑五種顏色的球若干個,每次取出三個球,打印出三種不同顏色球的可能取法。問題分析與算法設計⑴定義表示顏色的指針數組p,使其元素p[0]、p[1]、p[2]、p[3]、p[4]分別指向字符串“red”、“yellow”、“blue”、“white”、“black”,這5個字符串用于表示5種彩球顏色。指針數組p的定義方式如下:char*p[5]={"red","yellow","blue","white","black"};⑵使用0、1、2、3、4分別代表紅、黃、藍、白、黑五種顏色,使用窮舉法生成各種組合方案,具體由一個三重循環實現。設每次取出的球分別為i、j、k,它們分別是0、1、2、3和4等5種取值。外循環取第1個球,第二重循環取第2個球,第三重循取第3個球。由于3的個球顏色不能相同,所以只
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 光動力療法進展-洞察及研究
- 17.1.1 等腰三角形的性質 導學案
- 2025年山東省泰安市高新區良莊二中學英語八年級第二學期期末質量檢測模擬試題含答案
- 2025屆浙江省衢州市教聯盟體八下英語期末綜合測試模擬試題含答案
- 影視產業電影市場的現狀與未來
- 呼吸功能康復護理技術指導講課件
- 2025年共軛亞油酸藥理作用試題
- 統編版八年級語文下冊期末專題復習名句名篇默寫(含答案)
- 餐飲業農民工勞動權益保障與服務協議書
- 民族風情園場地經營承包與文化傳承合作協議
- 高效化學滅菌技術-洞察及研究
- 融媒體保密管理制度
- 2025至2030中國消防產業市場深度調研及發展前景及有效策略與實施路徑評估報告
- 2025江蘇揚州寶應縣“鄉村振興青年人才”招聘67人筆試參考題庫附答案詳解
- 地質災害危險性評估合同模板
- 公司廉政紀律管理制度
- 2025年高考全國二卷數學高考真題解析 含參考答案
- 保密知識競賽試題及答案
- T/CQAGS 3201-2023重慶好糧油壓榨菜籽油
- 2025新譯林版英語八上單詞默寫單(先鳥版)
- 自建門面租房協議書
評論
0/150
提交評論