lesson18數據的組織結構二指針與函數_第1頁
lesson18數據的組織結構二指針與函數_第2頁
lesson18數據的組織結構二指針與函數_第3頁
lesson18數據的組織結構二指針與函數_第4頁
lesson18數據的組織結構二指針與函數_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Lesson18數據的組織結構2024/5/24學習目標:31使用指針作為函數參數2024/5/243指針作為函數參數2例1:將兩個數從大到小輸出要求:通過使用函數的方法2024/5/243指針作為函數參數2voids*p1,int*p2);intmain(){inta,b;int*p_1,*p_2;scanf("%d%d",&a,&b);p_1=&a;p_2=&b;if(a<b)s);printf("\n%d,%d\n",a,b);}voids*p1,int*p2){intt;t=*p1;*p1=*p2;*p2=t;return;}…...20002020202420042008200C2028202C2030...59整型變量a

整型變量b(main)指針pr_1指針p_220002004(swap)指針p1指針p2整型p5920002004COPY5做法1lesson18_01_1.c2024/5/243指針作為函數參數2voids*p1,int*p2);intmain(){inta,b;int*p_1,*p_2;scanf("%d%d",&a,&b);

p_1=&a;p_2=&b;if(a<b)s);printf("%d,%d",*p_1,*p_2);}voids*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}…...20002020202420042008200C2028202C2030...59整型a

整型b(main)p_1p_22000200420002002COPY(swap)指針p1指針p2指針p****2000地址傳遞20002004做法2lesson18_01_2.c2024/5/243指針作為函數參數2例2:從鍵盤輸入10個數,輸出最大值分析:定義一個函數,該函數返回最大值的地址2024/5/243指針作為函數參數2#include<stdio.h>int*findMax(int*array,intlen);voidinput(intarray[],intlen);intmain(){inta[10];int*max;input(a,10);max=findMax(a,10);printf(“最大值為=%d”,*max);return0;}lesson18_02.c2024/5/243指針作為函數參數2int*findMax(int*array,intlen){int*p,*pmax=array;for(p=array;p<array+len;p++){if(*pmax<*p)pmax=p;}returnpmax;}voidinput(intarray[],intlen){inti;for(i=0;i<len;i++){scanf(“%d”,array+i);}return;}請注意參數的定義和函數中的使用方式!2024/5/243指針作為函數參數2結論:函數的形參是指針和函數的形參是數組二者本質是一致的,都是傳入的是一個地址2024/5/243課堂練習2從鍵盤輸入10個數,按從大到小的順序輸出分析:在主函數中定義數組data[10]

調用input函數,給data數組輸入值從data[0]開始的10個變量的中最大值的地址(findMax函數),將其和data[0]交換(swap函數)從data[1]開始的9個變量的中最大值的地址(findMax函數),將其和data[0]交換(swap函數)從data[2]開始的8個變量的中最大值的地址(findMax函數),將其和data[0]交換(swap函數)…………直道data[8]為止調用output函數輸出數組data的值循環(huán)2024/5/24定義函數output,輸出長度為l的數組avoidoutput(inta[],intl){ inti; for(i=0;i<l;i++){ printf("%4d",a[i]); } return;}int*max(int*a,intl){ int*maxp=a,i; for(i=0;i<l;i++){ if(*maxp<*(a+i)) maxp=a+i; } returnmaxp;}定義函數max,找出長度為l的數組a中最大值的地址lesson_18_px.c2024/5/24主函數intmain(){ intdata[]={1,4,6,7,0,8,2,10,12,9}; int*mp,i,t; printf("排序前\n"); output(data,10); for(i=0;i<10;i++){ mp=max(&data[i],10-i); t=data[i]; data[i]=*mp; *mp=t; } printf("排序后\n"); output(data,10);}注意max(&data[i],10-i)的寫法2024/5/243二級指針3進一步理解指針intx=0;int*p;p=&x;20000xp2000變量p也有地址3000如何取變量p的地址&p2024/5/243二級指針3intx=0;int*p;p=&x;20000xp20003000保存變量p的地址?定義指針變量int**pp;pp保存一個整型指針變量的地址!2024/5/243二級指針3intx=0;int*p;int**pp;p=&x;pp=&p20000xp20003000pp3000p*px*pp**pp2024/5/243指針與二維數組4再來看二維數組inta[3][4]第0個元素第1個元素第2個元素a[0]a[1]a[2]2024/5/243指針與二維數組4a[0]這是一個一維數組怎么確定其中的元素?a[0][1]可以理解成a[0]即是該數組的名稱2024/5/243指針與二維數組4二維數組:一個元素為一維數組的一維數組a[0]a[1]a[2]2024/5/243指針與二維數組4再來看二維數組inta[3][4]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]內存是一維的所以二維數組也是可以理解成一個”大”的一維數組二維數組在內存中是按行存儲問:a[1][3],在數組中的第幾個位置?a[i][j]呢?2024/5/243指針與二維數組4#include<stdio.h>intmain(){inta[2][4]={1,2,3,4,5,6,7,8};int*p,i;

p=&a[0][0];for(i=0;i<8;i++){printf("%3d",*(p+i));if(i%4==0)printf("\n");}}輸出二維數組的值lesson18_a.c2024/5/24aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020162032200020042016202420322036a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+1二維數組全理解2024/5/243指針與二維數組4指針與二維數組的關系

假設有下列定義:#defineROWNUM5#defineCOLNUM4inta[ROWNUM][COLNUM];int*ptr1;int(*ptr2)[COLNUM];/*指針類型為int[COLNUM]*/輸出二維數組的每個元素內容2024/5/243指針與二維數組4方法一:ptr1=a[0];for(i=0;i<ROWNUM;i++){for(j=0;j<COLNUM;j++)printf("%3d",*(ptr1+i*COLNUM+j));printf("\n");}lesson18_a2.c2024/5/243指針與二維數組4方法二:ptr2=a;for(i=0;i<ROWNUM;i++){for(j=0;j<COLNUM;j++)printf("%3d",*(*(ptr2+i)+j));printf("\n");}2024/5/243指針與二維數組4例3:構造一個如下所示的下三角方陣。

1000000

1200000

1230000

1234000

1234500

1234560

1234567

2024/5/243指針與二維數組4問題分析位于下三角部分的元素內容等于列下標加1,上三角部分的元素內容全部為0。位于下三角元素的坐標特點是i>=j;位于上三角元素的坐標特點是i<j。2024/5/24#include<stdio.h>#defineNUM7intmain(){inta[NUM][NUM];int*ptr,i,j;/*構造下三角方陣*/for(i=0;i<NUM;i++){ptr=*(a+i);/*ptr指向第i行的第1個元素*/for(j=0;j<NUM;j++)if(i>=j) *(ptr+j)=j+1;/*ptr+j指向ptr所指行的下標為j的元素*/ else *(ptr+j)=0;}

2024/5/24/*輸出下三角方陣*/for(i=0;i<NUM;i++){ptr=*(a+i);for(j=0;j<NUM;j++)printf("%3d",*(ptr+j));printf("\n");}return0;}lesson18_03.c2024/5/243課堂練習2已知有4個同學的3門課程的成績,輸出每門課程的最高分要求:1、定義函數findMax(int*a,intlen),查找從a開始的后面len個變量的最大值的地址2、在主函數調用該函數輸出最高分。2024/5/243指針數組5inta[10]int*d[10]a是數組,元素類型為整型d是數組,元素類型為整型指針dad[0]=&a[0]d[3]=&a[9]可以聲明數組,其元素都是指針(指針數組)相當于類型2024/5/243指針數組5例4:在程序中有5種顏色,將其輸出#include<stdio.h>intmain(){inti;char*color[5]={“red”,“green”,“yellow”,“blue”,“white"};/*初始化*/for(i=0;i<=4;i++)printf("%10s\n",color[i]);return0;}lesson18_04.c2024/5/243指針數組5在程序中有5種顏色,將其輸出red\0green\0yellow\0blue\0white\02024/5/243數組的指針6我們還可以聲明一個指針變量讓它指向一個數組int(*p)[5];p就是一個指針,要指向一個含有5個int類型元素的數組,指向其他的就會出現問題。

2024/5/243指針與字符串7字符串是一種以字符’\0’作為結束標志的字符數組。表示字符串可以有下面幾種方法:charstr1[]=“ThisisaCprogram.”;char*str2=“ThisisaCprogram.”;char*str3=(char*)malloc(sizeof(char)*25);strcpy(str3,str2);str1是一個含有21個元素的字符型數組,前20個元素用來存放字符序列“ThisisaCprogram.”,最后一個元素存放字符串結束符‘\0’;str2是一個指向字符串常量的指針;str3指向一塊動態(tài)申請且可以放置25個字符的存儲空間,調用strcpy()函數的目的是將str2所指向的字符串常量復制到str3指向的存儲空間中。2024/5/243指針與字符串7字符數組與字符指針的重要區(qū)別charsa[]="Thisisastring";char*sp="Thisisastring";saThisisastring\0spThisisastring\0如果要改變數組sa所代表的字符串,只能改變數組元素的內容如果要改變指針sp所代表的字符串,通常直接改變指針的值,讓它指向新的字符串2024/5/243指針與字符串7字符數組與字符指針的重要區(qū)別示例charsa[]="Thisisastring";char*sp="Thisisastring";strcpy(sa,"Hello");sp="Hello";sa=“Hello”;非法數組名是常量,不能對它賦值2024/5/243變量與內存8#include<stdio.h>intmain(){ inta=1,b=2,c=3; int*p; p=&b; printf("%d,%d,%d\n",*(p-1),*p,*(p+1)); return0;}棧區(qū)abcp分析程序結果lesson18_c.c2024/5/243萬能的指針8分析程序結果#include<stdio.h>intmain(){ intx=0x434241; char*p; p=&x; printf("*p=%d\n",*p); printf("%c\n",*p); printf("%c\n",*(p+1)); printf("%c\n",*(p+2));

printf("%c\n",*(p+3)); return0;}lesson18_d.c0676665x2024/5/243萬能的指針8分析程序結果#include<stdio.h>intmain(){ intx=0x434241; charc='A'; floatf=123.4; void*p; p=&x; printf("*p=%d\n",*(int*)p); p=&c; printf("*p=%c\n",*(int*)p); p=&f; printf("*p=%f\n",*(float*)p); return0;}lesson18_e.c強制類型轉換2024/5/243藏有玄機的數組9分析程序結果#include<stdio.h>intmain(){ intb,a[5],i; for(i=0;i<=5;i++) a[i]=i; printf("a[0]=%d\n",a[0]); printf("a[5]=%d\n",a[5]); printf("b=%d\n",b); return0;}ba[0]a[1]a[2]a[3]a[4]a[5]i將a和b換個位置?lesson18_f.c2024/5/243動態(tài)內存分配10所謂動態(tài)是指在程序運行之后,再根據實際需求申請相應的存儲空間,這樣既可以滿足用戶在確定所需的元素數量之后再申請空間,也可以提高存儲空間的利用率。

分塊地方給程序使用2024/5/243動態(tài)內存分配10(1)了解需要多少內存空間(2)利用C語言提供的動態(tài)分配函數來分配所需要的存儲空間。(3)使指針指向獲得的內存空間,以便用指針在該空間內實施運算或操作。(4)當使用完畢內存后,釋放這一空間。

2024/5/243動態(tài)內存分配10void*malloc(unsignedsize)在內存的動態(tài)存儲區(qū)中分配一連續(xù)空間,其長度為size若申請成功,則返回一個指向所分配內存空間的起始地址的指針若申請內存空間不成功,則返回NULL(值為0)返回值類

溫馨提示

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

最新文檔

評論

0/150

提交評論