指針,數組,內存分配,結構體_第1頁
指針,數組,內存分配,結構體_第2頁
指針,數組,內存分配,結構體_第3頁
指針,數組,內存分配,結構體_第4頁
指針,數組,內存分配,結構體_第5頁
已閱讀5頁,還剩48頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

補充內容指針的本質指針是變量指針的值就是內存單元(變量)的地址

inti=100;

int*p=&i;int**pi=π0x0012ff4c0x0012ff640x0012ff640x0012ff4c0x0012ff48100pipi指針的類型“一個int型的指針”,指的是“一個類型為int*的指針”,編譯器認為這樣的一個指針指向的內存單元為2字節,并將其內容解釋成int類型的值p++等價于p=p+1*sizeof(int)字符型的指針是?int**p中p的類型是什么?指針的類型(續)類型名和*結構形成了新的指針類型,但*是和后面的變量結合

int*a,b,c和int*a,b,c的寫法效果一樣,只有a是int型的指針,而b和c仍是int型的變量在c中,大多數是將指針定義為語言中固有的數據類型,而在DS中我們將遇到的指針類型更加多樣化。指針的類型(續)判斷一個指針是否有效?

if(p!=NULL)指針的初始化?如果指針變量是全局變量,則系統會默認將其值設為NULL,但如果指針變量是局部變量,系統不會給它賦初值,程序員必須明顯指明其初值,否則會導致不可預測的結果.指針的類型(續)指針不管是全局還是局部的,都應當在聲明它的時候初始化,要么賦予一個有效的地址,要以賦予NULL

int*pint=NULL; pint=0x1992;(這樣做的結果是什么??)指針的運算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);}習題要求使用指針和子函數完成以下程序:輸入3個整數a、b、c

,按大小順序輸出。指針的傳遞可以將函數的參數聲明為指針,此時,函數接受的參數是內存單元的地址而不是內存單元的值會帶來什么樣的影響?數組的本質任何數組,不論是靜態聲明還是動態創建的,其所有元素在內存中都是連續字節存放的數組的本質(續)數組下標數組下標從0開始,到元素個數減1為止,下標必須是整數或整數表達式,在引用數組元素時,編譯器通過下標值來計算所引用元素在內存中的地址。

a[3]=100

以上圖為例,計算出a+3*sizeof(int)

得到0x004284FC,將原來的46改寫為100數組的本質(續)數組名 數組名本身就標識了一個地址,數組名的值就是數組第一個元素的內存單元首地址,即:a==&a[0],這樣,可以通過同類指針迭代來遍歷整個數組(如int*p=a;)?思考:p和a都標識數組的首元素地址,但是有什么不同?數組的本質(續)引用數組元素的方法:(1)下標法(2)指針法數組的本質(續)另一方面,不能通過數組名來訪問整個數組,除非它是帶有\0結束符的字符數組(即字符串)。由于這個原因,任何兩個數組之間不能直接賦值

inta[10]={0,1}

intb[10]={0,1,2,3,4,5,6,7,8,9} a=b;//錯誤數組的本質(續)想將一個數組的值賦給另一個數組,必須按元素逐個賦值,或者使用內存拷貝函數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]);}數組的初始化指定數組的元素個數

inta[10];不指定數組的元素個數,而直接初始化

inta[]={1,2,3,4,5,6}; (等價于:inta[6];a[0]=1;a[1]=2;…)數組的初始化同時指定元素個數并初始化

inta[6]={1,2,3,4,5,6};

inta[100]={1};常見錯誤inta[5]={1,2,3,4,5,6};inta[10]={5,,12,2};注意防止越界系統不會對數組的邊界進行檢測,防止越界是程序員個人的事二維數組二維數組在C語言中以“行序優先”來存儲元素,即在存儲時,先存儲一行,再存第二行。inta[5][3],當我們訪問a[4][1]時,實際上編譯器是*((a+4*3)+1),在定義二維數組時,編譯器為了計算其地址必須知道該數組的列數,而不必知道行數。數組傳遞傳值、傳址★傳值:將數組元素作為參數傳遞★傳址:將數組的地址作為參數傳遞數組傳遞數組不能從函數的return語句中返回,如何實現數組元素值的雙向傳遞?--傳址。傳值--如果想按值來傳遞數組,可以傳遞數組元素,或者可以將數組封裝起來,例如放到結構體中做為一個成員,因為結構體默認是按值傳遞的。字符數組字符數組就是元素為字符變量的數組。字符數組與字符串?字符串是以\0為結束符的字符數組,因此字符數組不一定就是字符串。如果用一個字符串常量來初始化一個字符數組,數組的長度至少要比字符串常量的長度大1,用來保存‘\0’。字符數組(續)chararr1[]={‘a’,’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’,‘b’,‘c’,’\0’},*p=s; char*pchar="abc“;

printf("%s",p);

printf(“%s“,s);

printf("%s",pchar);}字符串復制和比較字符串復制必須使用strcpy或strncpy,不能用=復制,那樣是字符指針的賦值。同樣不要用==和>=,!=比較兩個字符串,而應用strcmp,strncmp;例題:例10.5輸出數組中的全部元素。假設有一個a數組,整型,有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)通過數組名計算數組元素地址,找出元素的值。

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)用指針變量指向數組元素。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復制為字符串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");}結構體將基本數據組合起來列成更大的結構數據類型,這就是結構體,也可以叫做用戶自定義數據類型。例子:三維系統中的座標結構體的定義Struct

addr{ charname[30]; charstreet[40]; charcity[20]; unsignedlongintzip;};//一個結構定義體就是一條語句結構體變量定義//以新定義的addr為新的數據類型struct

addr{ charname[30]; charstreet[40]; charcity[20]; unsignedlongintzip;}addr_a,addr_b,addr_c;如何定義結構體和結構體變量?訪問結構元素每個結構元素都可由句點操作符/成員操作符訪問

addr_a.zip=12345;

printf(“%d”,addr_a.zip);也可通過指向運算符->訪問結構元素。結構體的使用Struct

struct_type{

inta,b; charch;};Main(){

struct

struct_type

arg;

arg.a=1000; f1(arg);}f1(structstruct_type

parm){

printf(“%d”,parm.a)}結構指針Struct

addr*addr_pointer;//結構指針有兩種用途(1)對函數的引用調用;(2)建立鏈表和其它動態數據結構

通過結構指針訪問結構成員:

printf(addr_pointer->name);

printf(*addr_);結構體例題1有一個結構體變量stu,內含學生學號、姓名和3門課的成績。要求在main函數中賦以值,在另一函數print中將它們打印輸出。今用結構體變量作函數參數。#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:使用結構體指針改用指向結構體變量的指針作實參。可以在上面程序的基礎上作少量修改即可#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*);/*形參類型修改成指向結構體的指針變量*/

print(&stu);/*實參改為stu的起始地址*/}

voidprint(structstudent*p)/*形參類型修改了*/{

printf(FORMAT,p->num,p->name,p->score[0],p->score[1],p->score[2]);/*用指針變量調用各成員之值*/

printf("\n");}實驗二:個人通訊錄試設計一個個人通訊錄,能夠在通訊錄中插入,刪除,按名字查找聯系人的信息.要求: 1、使用結構體數組來存放聯系人的信息 2、對聯系人信息的插入、刪除、查找均設計成獨立的子函數用typpedef類型定義typedef可用于對已定義的數據類型產生一個別名,但并不產生新的數據類型。例:typedef

int

INT;

INTi,j;回顧如何使用typedef定義結構體變量及結構體指針??!用typpedef類型定義structstudent{ …… ……};typedef

structstudentSTU;STUs1,s2,*Ps1,*ps2;typedef

structstude

溫馨提示

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

評論

0/150

提交評論