




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C程序設計----組織數據ProgrammingInCC程序設計課程組織C語言入門數據操作過程組織基本算法判斷與選擇-------分支迭代與遞推-------循環窮舉-------流程轉向控制遞歸--------變量的存儲類型組織數據數組結構指針文件ProgrammingInC課程組織C語言入門ProgrammingInC組織數據-----1.數組(處理批量數據)數組類型;常用算法:排序、查找、求最大最小值等;用字符數組存取字符串;使用字符串處理函數處理字符串向函數傳遞一維數組和二維數組;(指針)ProgrammingInC組織數據-----1.數組(處理批量數據)Programmi組織數據-----2.指針(地址)指針的概念;難點:對指針數據類型的理解數組的下標法引用和指針法引用;難點:二維數組的地址和指針概念利用字符指針存取字符串;難點:字符數組和字符指針的區別與聯系指針數組應用;難點:指向數組的指針與指針數組的區別帶參數的main函數;。。。。。ProgrammingInC組織數據-----2.指針(地址)指針的概念;Program一、指針的概念變量與地址程序中:inti;
floatk;
內存中每個字節有一個編號-----地址…...…...2000200120022005內存02003ik
編譯或函數調用時為其分配內存單元變量是對程序中數據存儲空間的抽象ProgrammingInC一、指針的概念程序中:inti;內存中內存單元與地址main(){chara;intb;floatc;intd[3];intmax();
……}地址ProgrammingInC內存單元與地址main()地址ProgrammingIn…...…...2000200420062005整型變量i10變量i_pointer200120022003指針與指針變量指針:一個變量的地址指針變量:專門存放變量地址的變量2000指針指針變量變量的內容
變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量ProgrammingInC…...…...2000200420062005整型變量i1&與*運算符含義含義:取變量的地址單目運算符優先級:2結合性:自右向左含義:取指針所指向變量的內容單目運算符優先級:2結合性:自右向左兩者關系:互為逆運算理解…...…...2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內容是地址量*i_pointer----指針的目標變量,它的內容是數據&i_pointer---指針變量占用內存的地址200010i_pointer*i_pointer&i_pointeriProgrammingInC&與*運算符含義:取變量的地址含義:取指針所指向變量的內直接訪問與間接訪問直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量例i=3;-----直接訪問指針變量…...…...2000200420062005整型變量i10變量i_pointer20012002200320003例*i_pointer=20;-----間接訪問20ProgrammingInC直接訪問與間接訪問例i=3;---指針變量…...…...2000200420062005整型變量i10變量i_pointer2001200220032000整型變量k例k=i;--直接訪問k=*i_pointer;--間接訪問10例k=i;k=*i_pointer;ProgrammingInC指針變量…...…...2000200420062005整型指針變量指針變量與其所指向的變量之間的關系指針變量的定義一般形式:數據類型*指針名;3變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法標識符指針的目標變量的數據類型表示定義指針變量不是‘*’運算符例
int
*p1,*p2;float*q;注意:1、int*p1,*p2;
與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時所規定類型的變量4、指針變量定義后,變量值不確定,應用前必須先賦值ProgrammingInC指針變量指針變量的定義3變量i2000i_pointer*i指針變量的初始化一般形式:數據類型*指針名=初始地址值;賦給指針變量,不是賦給目標變量例
inti;int*p=&i;變量必須已說明過類型應一致例int*p=&i;
inti;例
inti;int*p=&i;int*q=p;用已初始化指針變量作初值ProgrammingInC指針變量的初始化賦給指針變量,例inti;變量必須已例
main(){inti=10;int*p;
*p=i;printf(“%d”,*p);}危險!例main(){inti=10,k;int*p;
p=&k;*p=i;printf(“%d”,*p);}指針變量必須先賦值,再使用…...…...2000200420062005整型變量i10指針變量p200120022003隨機ProgrammingInC例main()危險!例main()指針變零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:
int*p=0;
p指向地址為0的單元,系統保證該單元不作它用表示指針變量值沒有意義#defineNULL0int*p=NULL:p=NULL與未對p賦值不同用途:避免指針變量的非法引用在程序中常作為狀態比較例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時要進行強制類型轉換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數據的指針變量ProgrammingInC零指針與空類型指針p指向地址為0的單元,#define例指針的概念main(){inta;
int*pa=&a;a=10;printf("a:%d\n",a);printf("*pa:%d\n",*pa);printf("&a:%x(hex)\n",&a);printf("pa:%x(hex)\n",pa);printf("&pa:%x(hex)\n",&pa);}運行結果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex)…...…...f86f8af8cf8b整型變量a10指針變量paf87f88f89f86ProgrammingInC例指針的概念main()運行結果:…...…...f86例輸入兩個數,并使其從大到小輸出/*1-0*/main(){int*p1,*p2,*p,a,b;scanf("%d,%d",&a,&b);p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf("a=%d,b=%d\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);}運行結果:a=5,b=9max=9,min=5…...…...指針變量p1指針變量p20002008200220042006
指針變量p2
整型變量b
整型變量a5200692008200620082006ProgrammingInC例輸入兩個數,并使其從大到小輸出/*1-0*/main(二、指針與數組指向數組元素的指針變量例intarray[10];int*p;
p=&array[0];//p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指針p&array[0]p數組名是表示數組首地址的地址常量ProgrammingInC二、指針與數組指針的運算指針變量的賦值運算p=&a;(將變量a地址p)p=array;(將數組array首地址p)p=&array[i];(將數組元素地址p)p1=p2;(指針變量p2值p1)不能把一個整數p,也不能把p的值整型變量如inti,*p;p=1000;()i=p;()指針變量與其指向的變量具有相同數據類型ProgrammingInC指針的運算如inti,*p;指針變量與其指針的算術運算:pipid(i為整型數,d為p指向的變量所占字節數)p++,p--,p+i,p-i,p+=i,p-=i等若p1與p2指向同一數組,p1-p2=兩指針間元素個數(p1-p2)/dp1+p2無意義例p指向float數,則p+1p+14例p指向int型數組,且p=&a[0];則p+1指向a[1]例inta[10];int*p=&a[2];p++;*p=1;例inta[10];int*p1=&a[2];int*p2=&a[5];
則:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數組pp+1,a+1p+i,a+ip+9,a+91ProgrammingInC指針的算術運算:例p指向float數,則p+1p指針變量的關系運算若p1和p2指向同一數組,則p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1與p2指向同一元素若p1與p2不指向同一數組,比較無意義p==NULL或p!=NULLProgrammingInC指針變量的關系運算ProgrammingInC數組元素表示方法inta[10],*p=a;a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下標法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針法*p*(p+1)*(p+2)*(p+9)[]變址運算符a[i]
*(a+i)a[i]p[i]*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]ProgrammingInC數組元素表示方法inta[10],*p=a;a[0a[0]a[1]a[2]a[3]a[4]例數組元素的引用方法main(){inta[5],*pa,i;for(i=0;i<5;i++) a[i]=i+1;pa=a;for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i));for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]);for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);}12345paProgrammingInCa[0]a[1]a[2]a[3]a[4]例數組元素的引main(){inti,*p,a[7];p=a;for(i=0;i<7;i++)scanf("%d",p++);printf("\n");for(i=0;i<7;i++,p++)printf("%d",*p);}例注意指針的當前值p=a;pp58762730123456apppppp指針變量可以指到數組后的內存單元ProgrammingInCmain()例注意指針的當前值p=a;pp5876273一級指針變量與一維數組的關系int*p與intq[10]數組名是指針(地址)常量p=q;p+i是q[i]的地址數組元素的表示方法:下標法和指針法,即若p=q,則
p[i]q[i]*(p+i)*(q+i)
形參數組實質上是指針變量,即intq[]int*q在定義指針變量(不是形參)時,不能把int*p寫成intp[];系統只給p分配能保存一個指針值的內存區(一般2字節);而給q分配2*10字節的內存區ProgrammingInC一級指針變量與一維數組的關系ProgrammingIn三、指針與二維數組二維數組的地址對于一維數組:(1)數組名array表示數組的首地址,即array[0]的地址;(2)數組名array是地址常量(3)array+i是元素array[i]的地址(4)array[i]*(array+i)arrayintarray[10];ProgrammingInC三、指針與二維數組對于一維數組:arrayint對于二維數組:(1)a是數組名,
包含三個元素a[0],a[1],a[2](2)每個元素a[i]
又是一個一維
數組,包含4個
元素aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[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)+1ProgrammingInC對于二維數組:aa+1a+2*(*(a+0)+1)*(a[0對二維數組inta[3][4],有a-----二維數組的首地址,即第0行的首地址a+i-----第i行的首地址a[i]*(a+i)------第i行第0列的元素地址a[i]+j*(a+i)+j-----第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同a+i&a[i],表示第i行首地址,指向行a[i]*(a+i)&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[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]aa+1a+2ProgrammingInC對二維數組inta[3][4],有a+i=&a[i]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]二維數組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)(4)*(&a[0][0]+1*4+2)地址表示:(1)a+1
(2)&a[1][0](3)a[1](4)*(a+1)(5)(int*)(a+1)行指針列指針地址表示:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2(4)&a[0][0]+1*4+2ProgrammingInCinta[3][4];a[0][0]a[0][1]a[1表示形式含義地址a二維數組名,數組首地址a[0],*(a+0),*a第0行第0列元素地址a+1第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素地址*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素值2000200020082008201213ProgrammingInC表示形式含義地址a二維數組名,數組首地址a[0],*(a+0四、
指針與字符串字符串表示形式用字符數組實現例main(){charstring[]=“IloveChina!”;printf(“%s\n”,string);printf(“%s\n”,string+7);}IloveChistring[0]string[1]string[2]string[3]string[4]string[5]string[6]string[7]string[8]string[9]stringstring[10]string[11]string[12]string[13]n!a\0ProgrammingInC四、指針與字符串例mai用字符指針實現例#include<stdio.h>main(){ char*string="IloveChina!"; printf("%s\n",string); string+=7; while(*string) { putchar(string[0]); string++; }}IloveChistringn!a\0字符指針初始化:把字符串首地址賦給stringchar*string;string="IloveChina!";string*string!='\0'ProgrammingInC用字符指針實現例#include<stdio.h>I字符指針變量與字符數組char*cp;與charstr[20];str由若干元素組成,每個元素放一個字符;而cp中存放字符串首地址charstr[20];str=“IloveChina!”;()char*cp;cp=“IloveChina!”;()str是地址常量;cp是地址變量cp接受鍵入字符串時,必須先開辟存儲空間例charstr[10];scanf(“%s”,str);()而char*cp;scanf(“%s”,cp);()改為:char*cp,str[10];cp=str;scanf(“%s”,cp);()ProgrammingInC字符指針變量與字符數組例charstr[10];改字符串與數組關系字符串用一維字符數組存放字符數組具有一維數組的所有特點數組名是指向數組首地址的地址常量數組元素的引用方法可用指針法和下標法數組名作函數參數是地址傳遞等區別存儲格式:字符串結束標志賦值方式與初始化輸入輸出方式:%s%ccharstr[]={“Hello!”};()charstr[]=“Hello!”;()charstr[]={‘H’,‘e’,‘l’,‘l’,‘o’,‘!’};()char*cp=“Hello”;()inta[]={1,2,3,4,5};()int*p={1,2,3,4,5};()charstr[10],*cp;inta[10],*p;str=“Hello”;()cp=“Hello!”;()a={1,2,3,4,5};()p={1,2,3,4,5};()scanf(“%s”,str);printf(“%s”,str);gets(str);puts(str);ProgrammingInC字符串與數組關系charstr[]={“Hello!”五、二維數組的指針變量指向二維數組元素的指針變量例指向二維數組元素的指針變量-列指針main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int*p;for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)printf("\n"); printf("%4d",*p);}}p=*a;p=&a[0][0];p=*(a+0);p=a;p=*a;p=&a[0][0];p=(int*)a;p=a;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]pProgrammingInC五、二維數組的指針變量例指向二維數組元素的指針變量-列指指向一維數組的指針變量-行指針定義形式:數據類型(*指針名)[一維數組維數];例int(*p)[4];()不能少int(*p)[4]與int*p[4]不同p的值是一維數組的首地址,p是行指針可讓p指向二維數組某一行如inta[3][4],(*p)[4]=a;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]aa+1a+2pp+1p+2p[0]+1或*p+1p[1]+2或*(p+1)+2*(*p+1)*(*(p+1)+2)一維數組指針變量維數和二維數組列數必須相同行指針形式:int(*p)[n];含義:p為指向含有n個元素的一維數組的指針變量賦值:行指針變量=2維數組名或行指針變量ProgrammingInC指向一維數組的指針變量-行指針()不能少p的值是一維數組的例一維數組指針變量舉例main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
inti,j,(*p)[4];for(p=a,i=0;i<3;i++,p++)for(j=0;j<4;j++)printf("%d",*(*p+j));printf("\n");}p=a[0];p=*a;p=&a[0][0];p=&a[0];p=a[0];p=*a;p=&a[0][0];p=&a[0];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]pppp[0][j]ProgrammingInC例一維數組指針變量舉例main()p=a[0];p=a六、指針數組和多級指針用于處理二維數組或多個字符串指針數組定義:數組中的元素為指針變量定義形式:數據類型*數組名[數組長度說明];例int*p[4];指針所指向變量的數據類型區分int*p[4]與int(*p)[4]指針數組賦值與初始化賦值:main(){intb[2][3],*pb[2];
pb[0]=b[0];pb[1]=b[1];……..}int*pb[2]pb[0]pb[1]intb[2][3]123246初始化:main(){intb[2][3],*pb[]={b[0],b[1]};……..}int*pb[2]pb[0]pb[1]intb[2][3]123246ProgrammingInC六、指針數組和多級指針指針所指指針數組賦值與初始化Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0賦值:main(){chara[]="Fortran";charb[]="Lisp";charc[]="Basic";
char*p[4];
p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;……..}或:main(){char*p[4];p[0]="Fortran";p[1]="Lisp";p[2]="Basic";p[3]=NULL;……..}初始化:main(){char*p[]={"Fortran","Lisp","Basic",NULL};……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0ProgrammingInC指針數組賦值與初始化Lisp\0
charname[5][9]={“gain”,“much”,“stronger”,“point”,“bye”};
char*name[5]={“gain”,“much”,“stronger”,“point”,“bye”};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二維數組與指針數組區別:二維數組存儲空間固定字符指針數組相當于可變列長的二維數組分配內存單元=數組維數*2+各字符串長度指針數組元素的作用相當于二維數組的行名但指針數組中元素是指針變量二維數組的行名是地址常量ProgrammingInCcharname[5][9]={“gain”,“muc多級指針定義:指向指針的指針一級指針:指針變量中存放目標變量的地址p1&p2&i3P2(指針變量)i(整型變量)例int**p1;
int*p2;inti=3;p2=&i;p1=&p2;**p1=5;二級指針:指針變量中存放一級指針變量的地址例int*p;
inti=3;p=&i;*p=5;&i3P(指針變量)i(整型變量)一級指針單級間接尋址二級指針一級指針目標變量二級間接尋址ProgrammingInC多級指針p1&p2&i3P2(指針變量)i(整型變量)例定義形式:數據類型**指針名;如char**p;例inti,**p;p=&i;()//p是二級指針,不能用變量地址為其賦值最終目標變量的數據類型*p是p間接指向對象的地址**p是p間接指向對象的值例inti=3;
int*p1;
int**p2;p1=&i;p2=&p1;**p=5;ip1p23&i&p1**p2,*p1*p2多級指針例三級指針int***p;
四級指針char****p;ProgrammingInC定義形式:數據類型**指針名;例inti定義含義inti;int*p;inta[n];int*p[n];int(*p)[n];intf();int*p();int(*p)();int**p;定義整型變量ip為指向整型數據的指針變量定義含n個元素的整型數組an個指向整型數據的指針變量組成的指針數組pp為指向含n個元素的一維整型數組的指針變量f為返回整型數的函數p為返回指針的函數,該指針指向一個整型數據p為指向函數的指針變量,該函數返回整型數p為指針變量,它指向一個指向整型數據的指針變量指針的數據類型ProgrammingInC定義含義inti;int*p;inta[n];i例下列定義的含義(1)int*p[3];(2)int(*p)[3];(3)int*p(int);(4)int(*p)(int);指針數組指向一維數組的指針返回指針的函數指向函數的指針,函數返回int型變量ProgrammingInC例下列定義的含義指針數組指向一維數組的指針返回指針的函順序查找。從數組中查找指定的數據,并輸出其序號.#include<stdio.h>main(){inti,n,a[10]={4,6,2,9,7,3,0,5,1,8};printf("arrayare:");for(i=0;i<10;i++)printf("%3d",a[i]);printf("\nInputanumbertofind:");scanf("%d",&n);
for(i=0;i<10;i++)if(a[i]==n)break;
if(i<10)printf("pos=%d\n",i);elseprintf("pos=-1\n");}思考:統計數組中某個元素出現的個數,應如何設計?ProgrammingInC順序查找。從數組中查找指定的數據,并輸出其序號.Progralowhighmid例1234567891011513192137566475808892找211234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmid折半查找。從有序數組中查找指定的數據算法描述:ProgrammingInClowhighmid例123例1234567891011513192137566475808892lowhighmid找701234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmidProgrammingInC例1234折半查找。從有序數組中查找指定的數據算法實現設數組長為n,low、high和mid分別指向待查元素所在區間的上界、下界和中點,k為給定值初始時,令low=0,high=n-1,mid=(low+high)/2讓k與mid指向的記錄比較若k==a[mid],查找成功若k<a[mid],則high=mid-1若k>a[mid],則low=mid+1重復上述操作,直至low>high時,查找失敗ProgrammingInC折半查找。從有序數組中查找指定的數據Programming#include<stdio.h>main(){inti,n,s[10]={2,5,7,8,12,16,24,32,36,40};intlow,high,mid; printf("arrayare:");for(i=0;i<10;i++)printf("%3d",s[i]);printf("\nInputanumbertofind:");scanf("%d",&n);low=0;high=9;while(low<=high) {mid=(low+high)/2;if(s[mid]>n)high=mid-1;elseif(s[mid]<n)low=mid+1;elsebreak;}if(low>high)printf("pos=-1\n");elseprintf("pos=%d\n",mid);}ProgrammingInC#include<stdio.h>ProgrammingC程序設計----組織數據ProgrammingInCC程序設計課程組織C語言入門數據操作過程組織基本算法判斷與選擇-------分支迭代與遞推-------循環窮舉-------流程轉向控制遞歸--------變量的存儲類型組織數據數組結構指針文件ProgrammingInC課程組織C語言入門ProgrammingInC組織數據-----1.數組(處理批量數據)數組類型;常用算法:排序、查找、求最大最小值等;用字符數組存取字符串;使用字符串處理函數處理字符串向函數傳遞一維數組和二維數組;(指針)ProgrammingInC組織數據-----1.數組(處理批量數據)Programmi組織數據-----2.指針(地址)指針的概念;難點:對指針數據類型的理解數組的下標法引用和指針法引用;難點:二維數組的地址和指針概念利用字符指針存取字符串;難點:字符數組和字符指針的區別與聯系指針數組應用;難點:指向數組的指針與指針數組的區別帶參數的main函數;。。。。。ProgrammingInC組織數據-----2.指針(地址)指針的概念;Program一、指針的概念變量與地址程序中:inti;
floatk;
內存中每個字節有一個編號-----地址…...…...2000200120022005內存02003ik
編譯或函數調用時為其分配內存單元變量是對程序中數據存儲空間的抽象ProgrammingInC一、指針的概念程序中:inti;內存中內存單元與地址main(){chara;intb;floatc;intd[3];intmax();
……}地址ProgrammingInC內存單元與地址main()地址ProgrammingIn…...…...2000200420062005整型變量i10變量i_pointer200120022003指針與指針變量指針:一個變量的地址指針變量:專門存放變量地址的變量2000指針指針變量變量的內容
變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量ProgrammingInC…...…...2000200420062005整型變量i1&與*運算符含義含義:取變量的地址單目運算符優先級:2結合性:自右向左含義:取指針所指向變量的內容單目運算符優先級:2結合性:自右向左兩者關系:互為逆運算理解…...…...2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內容是地址量*i_pointer----指針的目標變量,它的內容是數據&i_pointer---指針變量占用內存的地址200010i_pointer*i_pointer&i_pointeriProgrammingInC&與*運算符含義:取變量的地址含義:取指針所指向變量的內直接訪問與間接訪問直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量例i=3;-----直接訪問指針變量…...…...2000200420062005整型變量i10變量i_pointer20012002200320003例*i_pointer=20;-----間接訪問20ProgrammingInC直接訪問與間接訪問例i=3;---指針變量…...…...2000200420062005整型變量i10變量i_pointer2001200220032000整型變量k例k=i;--直接訪問k=*i_pointer;--間接訪問10例k=i;k=*i_pointer;ProgrammingInC指針變量…...…...2000200420062005整型指針變量指針變量與其所指向的變量之間的關系指針變量的定義一般形式:數據類型*指針名;3變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法標識符指針的目標變量的數據類型表示定義指針變量不是‘*’運算符例
int
*p1,*p2;float*q;注意:1、int*p1,*p2;
與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時所規定類型的變量4、指針變量定義后,變量值不確定,應用前必須先賦值ProgrammingInC指針變量指針變量的定義3變量i2000i_pointer*i指針變量的初始化一般形式:數據類型*指針名=初始地址值;賦給指針變量,不是賦給目標變量例
inti;int*p=&i;變量必須已說明過類型應一致例int*p=&i;
inti;例
inti;int*p=&i;int*q=p;用已初始化指針變量作初值ProgrammingInC指針變量的初始化賦給指針變量,例inti;變量必須已例
main(){inti=10;int*p;
*p=i;printf(“%d”,*p);}危險!例main(){inti=10,k;int*p;
p=&k;*p=i;printf(“%d”,*p);}指針變量必須先賦值,再使用…...…...2000200420062005整型變量i10指針變量p200120022003隨機ProgrammingInC例main()危險!例main()指針變零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:
int*p=0;
p指向地址為0的單元,系統保證該單元不作它用表示指針變量值沒有意義#defineNULL0int*p=NULL:p=NULL與未對p賦值不同用途:避免指針變量的非法引用在程序中常作為狀態比較例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時要進行強制類型轉換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數據的指針變量ProgrammingInC零指針與空類型指針p指向地址為0的單元,#define例指針的概念main(){inta;
int*pa=&a;a=10;printf("a:%d\n",a);printf("*pa:%d\n",*pa);printf("&a:%x(hex)\n",&a);printf("pa:%x(hex)\n",pa);printf("&pa:%x(hex)\n",&pa);}運行結果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex)…...…...f86f8af8cf8b整型變量a10指針變量paf87f88f89f86ProgrammingInC例指針的概念main()運行結果:…...…...f86例輸入兩個數,并使其從大到小輸出/*1-0*/main(){int*p1,*p2,*p,a,b;scanf("%d,%d",&a,&b);p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf("a=%d,b=%d\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);}運行結果:a=5,b=9max=9,min=5…...…...指針變量p1指針變量p20002008200220042006
指針變量p2
整型變量b
整型變量a5200692008200620082006ProgrammingInC例輸入兩個數,并使其從大到小輸出/*1-0*/main(二、指針與數組指向數組元素的指針變量例intarray[10];int*p;
p=&array[0];//p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指針p&array[0]p數組名是表示數組首地址的地址常量ProgrammingInC二、指針與數組指針的運算指針變量的賦值運算p=&a;(將變量a地址p)p=array;(將數組array首地址p)p=&array[i];(將數組元素地址p)p1=p2;(指針變量p2值p1)不能把一個整數p,也不能把p的值整型變量如inti,*p;p=1000;()i=p;()指針變量與其指向的變量具有相同數據類型ProgrammingInC指針的運算如inti,*p;指針變量與其指針的算術運算:pipid(i為整型數,d為p指向的變量所占字節數)p++,p--,p+i,p-i,p+=i,p-=i等若p1與p2指向同一數組,p1-p2=兩指針間元素個數(p1-p2)/dp1+p2無意義例p指向float數,則p+1p+14例p指向int型數組,且p=&a[0];則p+1指向a[1]例inta[10];int*p=&a[2];p++;*p=1;例inta[10];int*p1=&a[2];int*p2=&a[5];
則:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數組pp+1,a+1p+i,a+ip+9,a+91ProgrammingInC指針的算術運算:例p指向float數,則p+1p指針變量的關系運算若p1和p2指向同一數組,則p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1與p2指向同一元素若p1與p2不指向同一數組,比較無意義p==NULL或p!=NULLProgrammingInC指針變量的關系運算ProgrammingInC數組元素表示方法inta[10],*p=a;a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下標法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針法*p*(p+1)*(p+2)*(p+9)[]變址運算符a[i]
*(a+i)a[i]p[i]*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]ProgrammingInC數組元素表示方法inta[10],*p=a;a[0a[0]a[1]a[2]a[3]a[4]例數組元素的引用方法main(){inta[5],*pa,i;for(i=0;i<5;i++) a[i]=i+1;pa=a;for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i));for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]);for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);}12345paProgrammingInCa[0]a[1]a[2]a[3]a[4]例數組元素的引main(){inti,*p,a[7];p=a;for(i=0;i<7;i++)scanf("%d",p++);printf("\n");for(i=0;i<7;i++,p++)printf("%d",*p);}例注意指針的當前值p=a;pp58762730123456apppppp指針變量可以指到數組后的內存單元ProgrammingInCmain()例注意指針的當前值p=a;pp5876273一級指針變量與一維數組的關系int*p與intq[10]數組名是指針(地址)常量p=q;p+i是q[i]的地址數組元素的表示方法:下標法和指針法,即若p=q,則
p[i]q[i]*(p+i)*(q+i)
形參數組實質上是指針變量,即intq[]int*q在定義指針變量(不是形參)時,不能把int*p寫成intp[];系統只給p分配能保存一個指針值的內存區(一般2字節);而給q分配2*10字節的內存區ProgrammingInC一級指針變量與一維數組的關系ProgrammingIn三、指針與二維數組二維數組的地址對于一維數組:(1)數組名array表示數組的首地址,即array[0]的地址;(2)數組名array是地址常量(3)array+i是元素array[i]的地址(4)array[i]*(array+i)arrayintarray[10];ProgrammingInC三、指針與二維數組對于一維數組:arrayint對于二維數組:(1)a是數組名,
包含三個元素a[0],a[1],a[2](2)每個元素a[i]
又是一個一維
數組,包含4個
元素aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[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)+1ProgrammingInC對于二維數組:aa+1a+2*(*(a+0)+1)*(a[0對二維數組inta[3][4],有a-----二維數組的首地址,即第0行的首地址a+i-----第i行的首地址a[i]*(a+i)------第i行第0列的元素地址a[i]+j*(a+i)+j-----第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同a+i&a[i],表示第i行首地址,指向行a[i]*(a+i)&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[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]aa+1a+2ProgrammingInC對二維數組inta[3][4],有a+i=&a[i]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]二維數組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)(4)*(&a[0][0]+1*4+2)地址表示:(1)a+1
(2)&a[1][0](3)a[1](4)*(a+1)(5)(int*)(a+1)行指針列指針地址表示:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2(4)&a[0][0]+1*4+2ProgrammingInCinta[3][4];a[0][0]a[0][1]a[1表示形式含義地址a二維數組名,數組首地址a[0],*(a+0),*a第0行第0列元素地址a+1第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空航天復合材料 課件知識點1 聚合物基復合材料概論
- 山東醫專入學考試試題及答案
- 腫瘤防治與精準醫學前沿進展
- 自我意識心理健康教育
- 秩序隊員法律法規培訓
- 呼吸內科門診病歷
- 中班藝術活動《冬天里的活動》
- 園區招商培訓計劃
- 2025年中國女性生物纖維素面膜行業市場全景分析及前景機遇研判報告
- 大班健康教案:冬季護膚品使用指南
- 2025至2030年中國玉米淀粉行業市場現狀分析及前景戰略研判報告
- 2025年江蘇高考政治試卷真題解讀及答案講解課件
- 2025上半年山東高速集團有限公司社會招聘211人筆試參考題庫附帶答案詳解析集合
- 遼寧省點石聯考2024-2025學年高二下學期6月份聯合考試化學試題(含答案)
- 2025高考全國一卷語文真題
- DTLDTC帶式輸送機工藝流程圖
- 熒光綠送貨單樣本excel模板
- 有機化學概述
- 復盛零件手冊
- 內外墻抹灰施工承包合同
- 《急救藥品》PPT課件.ppt
評論
0/150
提交評論