版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
補充內(nèi)容指針的本質(zhì)指針是變量指針的值就是內(nèi)存單元(變量)的地址
inti=100;
int*p=&i;int**pi=π0x0012ff4c0x0012ff640x0012ff640x0012ff4c0x0012ff48100pipi指針的類型“一個int型的指針”,指的是“一個類型為int*的指針”,編譯器認為這樣的一個指針指向的內(nèi)存單元為2字節(jié),并將其內(nèi)容解釋成int類型的值p++等價于p=p+1*sizeof(int)字符型的指針是?int**p中p的類型是什么?指針的類型(續(xù))類型名和*結(jié)構(gòu)形成了新的指針類型,但*是和后面的變量結(jié)合
int*a,b,c和int*a,b,c的寫法效果一樣,只有a是int型的指針,而b和c仍是int型的變量在c中,大多數(shù)是將指針定義為語言中固有的數(shù)據(jù)類型,而在DS中我們將遇到的指針類型更加多樣化。指針的類型(續(xù))判斷一個指針是否有效?
if(p!=NULL)指針的初始化?如果指針變量是全局變量,則系統(tǒng)會默認將其值設(shè)為NULL,但如果指針變量是局部變量,系統(tǒng)不會給它賦初值,程序員必須明顯指明其初值,否則會導致不可預(yù)測的結(jié)果.指針的類型(續(xù))指針不管是全局還是局部的,都應(yīng)當在聲明它的時候初始化,要么賦予一個有效的地址,要以賦予NULL
int*pint=NULL; pint=0x1992;(這樣做的結(jié)果是什么??)指針的運算int*p1,*p2;p++;p--;p+=5;p-=5;p2-p1;p2=p1;>,<,>=,<=,!=,==&(取址),*(取值)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("\na=%d,b=%d\n\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);}Swap(int*p1,int*p2)
{inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;
}main(){
int
a,b;
int*pointer-1,*pointer-2;
scanf("%d,%d",&a,&b);
pointer-1=&a;pointer-2=&B;if(a<b)Swap(pointer-1,pointer-2);
printf("\n%d,%d\n",a,b);}習題要求使用指針和子函數(shù)完成以下程序:輸入3個整數(shù)a、b、c
,按大小順序輸出。指針的傳遞可以將函數(shù)的參數(shù)聲明為指針,此時,函數(shù)接受的參數(shù)是內(nèi)存單元的地址而不是內(nèi)存單元的值會帶來什么樣的影響?數(shù)組的本質(zhì)任何數(shù)組,不論是靜態(tài)聲明還是動態(tài)創(chuàng)建的,其所有元素在內(nèi)存中都是連續(xù)字節(jié)存放的數(shù)組的本質(zhì)(續(xù))數(shù)組下標數(shù)組下標從0開始,到元素個數(shù)減1為止,下標必須是整數(shù)或整數(shù)表達式,在引用數(shù)組元素時,編譯器通過下標值來計算所引用元素在內(nèi)存中的地址。
a[3]=100
以上圖為例,計算出a+3*sizeof(int)
得到0x004284FC,將原來的46改寫為100數(shù)組的本質(zhì)(續(xù))數(shù)組名 數(shù)組名本身就標識了一個地址,數(shù)組名的值就是數(shù)組第一個元素的內(nèi)存單元首地址,即:a==&a[0],這樣,可以通過同類指針迭代來遍歷整個數(shù)組(如int*p=a;)?思考:p和a都標識數(shù)組的首元素地址,但是有什么不同?數(shù)組的本質(zhì)(續(xù))引用數(shù)組元素的方法:(1)下標法(2)指針法數(shù)組的本質(zhì)(續(xù))另一方面,不能通過數(shù)組名來訪問整個數(shù)組,除非它是帶有\(zhòng)0結(jié)束符的字符數(shù)組(即字符串)。由于這個原因,任何兩個數(shù)組之間不能直接賦值
inta[10]={0,1}
intb[10]={0,1,2,3,4,5,6,7,8,9} a=b;//錯誤數(shù)組的本質(zhì)(續(xù))想將一個數(shù)組的值賦給另一個數(shù)組,必須按元素逐個賦值,或者使用內(nèi)存拷貝函數(shù)memcpy()
main(){
inta[]={1,2};
intb[]={5,6,7,8};
inti;
clrscr(); memcpy(a,b,4);
for(i=0;i<2;i++)
printf("%d",a[i]);}數(shù)組的初始化指定數(shù)組的元素個數(shù)
inta[10];不指定數(shù)組的元素個數(shù),而直接初始化
inta[]={1,2,3,4,5,6}; (等價于:inta[6];a[0]=1;a[1]=2;…)數(shù)組的初始化同時指定元素個數(shù)并初始化
inta[6]={1,2,3,4,5,6};
inta[100]={1};常見錯誤inta[5]={1,2,3,4,5,6};inta[10]={5,,12,2};注意防止越界系統(tǒng)不會對數(shù)組的邊界進行檢測,防止越界是程序員個人的事二維數(shù)組二維數(shù)組在C語言中以“行序優(yōu)先”來存儲元素,即在存儲時,先存儲一行,再存第二行。inta[5][3],當我們訪問a[4][1]時,實際上編譯器是*((a+4*3)+1),在定義二維數(shù)組時,編譯器為了計算其地址必須知道該數(shù)組的列數(shù),而不必知道行數(shù)。數(shù)組傳遞傳值、傳址★傳值:將數(shù)組元素作為參數(shù)傳遞★傳址:將數(shù)組的地址作為參數(shù)傳遞數(shù)組傳遞數(shù)組不能從函數(shù)的return語句中返回,如何實現(xiàn)數(shù)組元素值的雙向傳遞?--傳址。傳值--如果想按值來傳遞數(shù)組,可以傳遞數(shù)組元素,或者可以將數(shù)組封裝起來,例如放到結(jié)構(gòu)體中做為一個成員,因為結(jié)構(gòu)體默認是按值傳遞的。字符數(shù)組字符數(shù)組就是元素為字符變量的數(shù)組。字符數(shù)組與字符串?字符串是以\0為結(jié)束符的字符數(shù)組,因此字符數(shù)組不一定就是字符串。如果用一個字符串常量來初始化一個字符數(shù)組,數(shù)組的長度至少要比字符串常量的長度大1,用來保存‘\0’。字符數(shù)組(續(xù))chararr1[]={‘a(chǎn)’,’b’,’\0’,’d’,’e’};chararr2[]=“hello”;char*p=“hello”;printf(“%d”,sizeof(arr1));printf(“%d”,strlen(arr1));printf(“%d”,sizeof(arr2));printf(“%d”,strlen(arr2));printf(“%d”,strlen(p));字符指針C可用char*表示字符串 main(){ chars[]={‘a(chǎn)’,‘b’,‘c’,’\0’},*p=s; char*pchar="abc“;
printf("%s",p);
printf(“%s“,s);
printf("%s",pchar);}字符串復(fù)制和比較字符串復(fù)制必須使用strcpy或strncpy,不能用=復(fù)制,那樣是字符指針的賦值。同樣不要用==和>=,!=比較兩個字符串,而應(yīng)用strcmp,strncmp;例題:例10.5輸出數(shù)組中的全部元素。假設(shè)有一個a數(shù)組,整型,有10個元素。要輸出各元素的值有三種方法:(1)下標法。main(){
inta[10];
inti;for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");for(i=0;i<10;i++)
printf("%d",a[i]);}(2)通過數(shù)組名計算數(shù)組元素地址,找出元素的值。
main(){
inta[10];
inti;for(i=0;i<10;i++)
scanf("%d",a+i);
printf("\n");for(i=0;i<10;i++)
printf("%D",*(a+i));}(3)用指針變量指向數(shù)組元素。main(){
inta[10];
int*p,i;
for(p=a;p<a+10;p++)
scanf("%d",p);
printf("\n");for(p=a;p<(a+10);p++)
printf("%d",*p);}例題將字符串a(chǎn)復(fù)制為字符串bmain(){chara[]="iamaboy.",b[20];
inti;
for(i=0;*(a+i)!=′\0′;i++)*(b+i)=*(a+i);*(b+i)=′\0′;
printf("stringais:%s\n",a);
printf("stringbis:");for(i=0;b[i]!=′\0′;i++)
printf("%c",b[i]);
printf("\n");}main(){chara[]="IamaBoy.",B[20],*p1,*p2;
inti;p1=a;p2=B;for(;*p1!=′\0′;p1++,p2++)*p2=*p1;*p2=′\0′;
printf("stringais:%S\n",a);
printf("stringBis:");for(i=0;B[i]!=′\0′;i++)
printf("%C",B[i]);
printf("\n");}結(jié)構(gòu)體將基本數(shù)據(jù)組合起來列成更大的結(jié)構(gòu)數(shù)據(jù)類型,這就是結(jié)構(gòu)體,也可以叫做用戶自定義數(shù)據(jù)類型。例子:三維系統(tǒng)中的座標結(jié)構(gòu)體的定義Struct
addr{ charname[30]; charstreet[40]; charcity[20]; unsignedlongintzip;};//一個結(jié)構(gòu)定義體就是一條語句結(jié)構(gòu)體變量定義//以新定義的addr為新的數(shù)據(jù)類型struct
addr{ charname[30]; charstreet[40]; charcity[20]; unsignedlongintzip;}addr_a,addr_b,addr_c;如何定義結(jié)構(gòu)體和結(jié)構(gòu)體變量?訪問結(jié)構(gòu)元素每個結(jié)構(gòu)元素都可由句點操作符/成員操作符訪問
addr_a.zip=12345;
printf(“%d”,addr_a.zip);也可通過指向運算符->訪問結(jié)構(gòu)元素。結(jié)構(gòu)體的使用Struct
struct_type{
inta,b; charch;};Main(){
struct
struct_type
arg;
arg.a=1000; f1(arg);}f1(structstruct_type
parm){
printf(“%d”,parm.a)}結(jié)構(gòu)指針Struct
addr*addr_pointer;//結(jié)構(gòu)指針有兩種用途(1)對函數(shù)的引用調(diào)用;(2)建立鏈表和其它動態(tài)數(shù)據(jù)結(jié)構(gòu)
通過結(jié)構(gòu)指針訪問結(jié)構(gòu)成員:
printf(addr_pointer->name);
printf(*addr_);結(jié)構(gòu)體例題1有一個結(jié)構(gòu)體變量stu,內(nèi)含學生學號、姓名和3門課的成績。要求在main函數(shù)中賦以值,在另一函數(shù)print中將它們打印輸出。今用結(jié)構(gòu)體變量作函數(shù)參數(shù)。#include<string.h>#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;charname[20];floatscore[3];};main(){ voidprint(structstudent);
structstudentstu;
stu.num=12345;
strcpy(stu.name,"LiLi");stu.score[0]=67.5;stu.score[1]=89;stu.score[2]=78.6;
print(stu);}voidprint(structstudentstu){
printf(FORMAT,stu.num,,stu.score[0],stu.score[1],stu.score[2]);
printf("\n");}解法2:使用結(jié)構(gòu)體指針改用指向結(jié)構(gòu)體變量的指針作實參。可以在上面程序的基礎(chǔ)上作少量修改即可#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"
structstudent{intnum;charname[20];floatscore[3];}stu={12345,"LiLi",67.5,89,78.6};main(){ voidprint(structstudent*);/*形參類型修改成指向結(jié)構(gòu)體的指針變量*/
print(&stu);/*實參改為stu的起始地址*/}
voidprint(structstudent*p)/*形參類型修改了*/{
printf(FORMAT,p->num,p->name,p->score[0],p->score[1],p->score[2]);/*用指針變量調(diào)用各成員之值*/
printf("\n");}實驗二:個人通訊錄試設(shè)計一個個人通訊錄,能夠在通訊錄中插入,刪除,按名字查找聯(lián)系人的信息.要求: 1、使用結(jié)構(gòu)體數(shù)組來存放聯(lián)系人的信息 2、對聯(lián)系人信息的插入、刪除、查找均設(shè)計成獨立的子函數(shù)用typpedef類型定義typedef可用于對已定義的數(shù)據(jù)類型產(chǎn)生一個別名,但并不產(chǎn)生新的數(shù)據(jù)類型。例:typedef
int
INT;
INTi,j;回顧如何使用typedef定義結(jié)構(gòu)體變量及結(jié)構(gòu)體指針??!用typpedef類型定義structstudent{ …… ……};typedef
structstudentSTU;STUs1,s2,*Ps1,*ps2;typedef
structstude
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年電影制作、發(fā)行和放映合同
- 職高電氣基礎(chǔ)課程設(shè)計答案
- 自動倒角機現(xiàn)狀課程設(shè)計
- 芣苢課程設(shè)計
- 自動化編程講解課程設(shè)計
- 苯乙醇課程設(shè)計
- 希臘國際高中課程設(shè)計
- 支教特色美術(shù)課程設(shè)計
- 碳匯課程設(shè)計
- 稅收情況工作總結(jié)
- B2C網(wǎng)絡(luò)商店物流服務(wù)質(zhì)量及其與顧客忠誠的關(guān)系研究的中期報告
- 年同等學歷考研申碩綜合科復(fù)習指導(教育心理學)課件
- 線段角動點問題
- 劍橋英語PET真題校園版
- 【課件】沉心靜氣打贏最后一仗 課件-2022-2023學年高中主題班會
- 2023-2024學年山東省臨沂市小學語文六年級期末評估考試題附參考答案和詳細解析
- 2021傳播心理學課程教學大綱
- 農(nóng)學技能高考【種植類】復(fù)習題庫大全-2、《植物生產(chǎn)與環(huán)境》-下(判斷題)
- HSk-lesson07part2-第-七-課-最好的醫(yī)生是自己
- 抖音直播電商項目計劃書抖音電商創(chuàng)業(yè)商業(yè)計劃書抖音直播帶貨計劃書抖音電商運營方案
- GB/T 24218.2-2009紡織品非織造布試驗方法第2部分:厚度的測定
評論
0/150
提交評論