C语言的指标Points属於一种低阶的程式处理功能答辩.docx
- 文档编号:5454505
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:14
- 大小:79.77KB
C语言的指标Points属於一种低阶的程式处理功能答辩.docx
《C语言的指标Points属於一种低阶的程式处理功能答辩.docx》由会员分享,可在线阅读,更多相关《C语言的指标Points属於一种低阶的程式处理功能答辩.docx(14页珍藏版)》请在冰豆网上搜索。
C语言的指标Points属於一种低阶的程式处理功能答辩
第3章
1.C語言的「指標」(Points)屬於一種低階的程式處理功能,可以直接存取記憶體位址,指標變數的變數內容並不是字元或數值等基本資料型態的值,而是其它變數的「位址」(Address)。
「指標變數」(PointerVariables)是一種變數,其變數值是其它變數的位址(Address),如下圖所示:
上述圖例有3個變數size、size1和ptr,變數值分別為35、57和1004,1004是變數size1的位址,換句話說,ptr是一個指標變數,為什麼叫指標變數?
因為這個變數是一個指向變數size1的位址,引導我們找到真正的變數值。
2.
取得變數位址
因為指標變數的目的是指向其它變數的位址,例如:
宣告一個整數變數和指標變數,如下所示:
intj;
int*ptr;
上述程式碼的指標變數和變數都擁有相同資料型態,所以可以將指標變數ptr指向變數j的位址,取得變數位址是使用單運算元的「&」取址運算子,如下所示:
ptr=&j;
上述程式碼將指標變數的值指定成變數j的記憶體位址,如下圖所示:
上述圖例可以看到指標變數ptr的值是0022FF78,這是整數變數j的記憶體位址。
取得指標變數所指的變數值
指標變數之所以稱為指標,這是因為指標變數的值是指向其它變數的位址,換句話說,指標變數對於程式設計者來說,其意義不在指標變數本身,而是它指向的哪一個變數值。
在C程式取得指標變數指向的變數值是使用單運算元的「*」星號運算子,稱為「取值」(Indirection)或「解參考」(Dereferencing)運算子,例如:
ptr是指向整數變數j的指標變數,*ptr就是變數j的值,如下所示:
printf("*ptr:
位址%p的值=%d\n",ptr,*ptr);
上述printf()函數使用%p格式字元顯示指標變數的值,ptr是變數j的位址,*ptr是變數j的值。
3.data、&data[0]、&data[LEN-1]
4.
a.status、ptr->status
a.age=20;ptr->age=20;
strcpy(a.name,“陳會安”);strcpy(ptr->name,“陳會安”);
5.
0、1、4、3、2
6.‘\0’
7~12.各種字串處理的C語言函數,如下所示:
字串複製
char*strcpy(char*str1,char*str2)
{
inti;
for(i=0;str2[i]!
='\0';i++)
str1[i]=str2[i];/*複製字串內容*/
str1[i]='\0';/*設定字串結束*/
returnstr1;
}
結合兩字串
char*strcat(char*str1,char*str2)
{
inti,j;
for(i=0;str1[i]!
='\0';i++);/*找字串str1結束*/
for(j=0;str2[j]!
='\0';j++)/*複製字串內容*/
str1[i+j]=str2[j];
str1[i+j]='\0';/*設定字串結束*/
returnstr1;
}
取代字串
char*strrep(char*str1,char*str2,intpos)
{
inti,j;
pos--;/*計算字串的開始*/
i=0;
for(j=pos;str1[j]!
='\0';j++)/*走訪字串str1*/
if(str2[i]!
='\0')
{
str1[j]=str2[i];/*取代str2至str1*/
i++;
}
else
break;
returnstr1;
}
計算字串長度
intstrlen(char*str)
{
inti;
for(i=0;str[i]!
='\0';i++);/*用迴圈計算長度*/
returni;
}
插入字串
char*strins(char*str1,char*str2,intpos)
{
ints_len;/*字串str1之長度*/
intd_len;/*字串str1之長度*/
inti,j;
pos--;/*計算字串的開始*/
s_len=strlen(str1);/*計算字串長度*/
d_len=strlen(str2);
for(i=s_len+1;i>=pos;i--)/*空出str2的空間*/
str1[i+d_len]=str1[i];
/*用迴圈填入str2至字串str1*/
for(j=pos;str2[j-pos]!
='\0';j++)
str1[j]=str2[j-pos];
returnstr1;
}
字串刪除
char*strdel(char*str,intpos,intlen)
{
inti;
pos--;/*計算字串的開始*/
/*從pos開始刪除長度len的字串*/
for(i=pos+len;str[i]!
='\0';i++)
str[i-len]=str[i];
str[i-len]='\0';/*新的字串結束*/
returnstr;
}
字串比較
intstrcmp(char*str1,char*str2)
{
inti,j;
for(i=0;str1[i]==str2[i];i++)
/*字串1等於字串2*/
if(str1[i]=='\0'&&str2[i]=='\0')
return0;
if(str1[i] return-1; return1;/*字串1大於字串2*/ } 取出子字串 char*substr(char*str,intpos,intlen) { staticcharstr1[100];/*子字串宣告*/ inti,j,end; pos--;/*計算字串的開始*/ end=pos+len-1;/*計算結束位置*/ for(i=pos,j=0;i<=end;i++,j++) str1[j]=str[i];/*複製字串內容*/ str1[len]='\0';/*設定字串結束*/ returnstr1; } 在字串中找尋子字串 intstrindex(char*str1,char*str2) { intend,i,j; end=strlen(str1)-strlen(str2);/*計算結束位置*/ if(end>0)/*子字串小於字串*/ { for(i=0;i<=end;i++) /*用迴圈比較各字元*/ for(j=i;str1[j]==str2[j-i];j++) if(str2[j-i+1]=='\0')/*子字串字結束*/ returni+1;/*找到了子字串*/ } return-1; } 分割字串 inttoken(char*str1,char*str2,intpos) { inti,j; i=pos;/*從分割位置開始*/ while(str1[i]=='')/*跳過之前空白字元*/ i++; if(str1[i]! ='\0')/*是不是字串結束*/ { j=0;/*找下一個空白字元*/ while(str1[i]! ='\0'&&str1[i]! ='') { str2[j]=str1[i];/*複製非空白字元*/ i++; j++; } str2[j]='\0';/*分割字串結束字元*/ returni;/*傳回目前位置*/ } else return-1;/*分割結束*/ } 程式範例 字串和數學運算式的分割 /*----------------------------------------*/ /*分割字串或數學運算式*/ /*----------------------------------------*/ inttoken(char*str1,char*str2,intpos) { inti,j; i=pos;/*從分割位置開始*/ while(str1[i]=='')/*跳過空字元*/ i++; if(str1[i]! ='\0')/*不是字串結束*/ { j=0;/*找下一個空白字元*/ while(str1[i]! ='\0'&&str1[i]! ='') { str2[j]=str1[i];/*拷貝非空白字元*/ if(operator(str1[i]))/*是不是運算子*/ /*是否分割字串是運算子*/ if(j>0) {/*不是*/ str2[j]='\0';/*傳回之前的字串*/ returni; } else {/*是*/ str2[j+1]='\0';/*傳回運算子*/ returni+1; } i++; j++; } str2[j]='\0';/*分割字串結束字元*/ returni;/*傳回目前位置*/ } else return-1;/*分割結束*/ } /*----------------------------------------*/ /*分割運算子字串設定*/ /*----------------------------------------*/ intoperator(charop) { switch(op) { case'+': case'-': case'*': case'/': case'=': case'.': return1;/*是運算子*/ default: return0;/*不是運算子*/ } } /*----------------------------------------*/ /*主程式*/ /*----------------------------------------*/ voidmain() { charstring[100];/*字串陣列宣告*/ chartoken_string[20];/*分割字串宣告*/ intpos;/*分割位置*/ printf("請輸入字串==>"); gets(string);/*讀取字串*/ pos=0;/*設定分割位置初值*/ printf("分割結果: \n"); /*分割字串直到字串結束*/ while((pos=token(string,token_string,pos))! =-1) printf("%s\n",token_string);/*印出各分割字串*/ } 第5章 1.堆疊擁有的特性,如下所示: ☐只允許從堆疊的頂端存取資料。 ☐資料存取的順序是先進後出(LastOut,FirstIn),也就是後存入堆疊的資料,反而先行取出。 C語言的函數呼叫 C語言函數呼叫的執行過程就是使用作業系統的堆疊儲存目前的執行狀態,例如: C程式擁有主程式main()和a()和b()兩個函數,如下所示: 上述M1、M2、A1、A2和B分別代表程式區塊,程式的執行順序依序為: M1→A1→B→A2→M2。 當主程式main()執行M1程式區塊後呼叫和進入函數a(),此時的堆疊如下圖所示: 上述圖例的top是指向堆疊頂端的變數,筆者只以返回位址為例(保留的狀態應該包含所有區域變數和參數值),將主程式main()的返回位址1存入堆疊,接著執行完A1程式區塊後進入函數b(),返回位址2被存入堆疊,如下圖所示: 在當執行完函數b()後,接著從作業系統堆疊取出返回位址2,以便繼續執行A2程式區塊,目前的堆疊如下圖所示: 等到執行完A2程式區塊後,作業系統再繼續從堆疊取出返回位址1,繼續主程式M2程式區塊的執行,完成整個程式的執行,此時堆疊已經空了,這整個流程就是作系統處理C函數呼叫的過程。 陣列和鏈結串列建立堆疊的差異主要在記憶體配置的不同,陣列表示法的堆疊會全滿,而串列堆疊除非記憶體不足,否則並不會全滿。 2.4、3、2、1 3. 4.[4][5][5] 5.前序和後序表示法並不會有括號,不只如此,甚至不需要運算子的優先順序,因為前序和後序運算式的計算順序只有一種且非常明確,所以前後和後序表示法也稱為無括號表示法。 6. ☐中序運算式: 2+(5-3)*6。 2+(5-3)*6 2+2*6 2+12 14 ☐後序運算式: 56*2-45*+13*-。 56*2–45*+13*- 302–45*+13*- 2845*+13*- 2820+13*- 4813*- 483– 45 ☐後序運算式: 36+42/*5+。 36+42/*5+ 942/*5+ 92*5+ 185+ 23 7. ☐A-B*CABC*- 讀入字元 堆疊內容 輸出字元 A A - - B - AB * -* C -* ABC - ABC* ABC*- ☐(A+B)*(C+D)/EAB+CD+*E/ 讀入字元 堆疊內容 輸出字元 ( ( A ( A + (+ B (+ AB ) AB+ * * AB+ ( *( AB+ C *( AB+C + *(+ AB+C D *(+ AB+CD ) * AB+CD+ / / AB+CD+* E / AB+CD+*E AB+CD+*E/ ☐A*(B-C)/DABC-*D/ 讀入字元 堆疊內容 輸出字元 A A * * A ( *( A B *( AB - *(- AB C *(- ABC ) * ABC- / / ABC-* D / ABC-*D ABC-*D/ ☐(A*B+C*D)*E*(F-G)AB*CD*+E*FG-* 讀入字元 堆疊內容 輸出字元 ( ( A ( A * (* A B (* AB + (+ AB* C (+ AB*C * (+* AB*C D (+* AB*CD ) AB*CD*+ * * AB*CD*+ E * AB*CD*+E * * AB*CD*+E* ( *( AB*CD*+E* F *( AB*CD*+E*F - *(- AB*CD*+E*F G *(- AB*CD*+E*FG ) * AB*CD*+E*FG- AB*CD*+E*FG-* 8.請參閱第三章最後一題習題的程式範例。 9.returnn*(n-1); 10.returnn+(n-1); 11.請參考第5-4節走迷宮問題的程式碼 12.請參考第5-4節走迷宮問題的程式碼
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指标 Points 属於 一种 低阶 程式 处理 功能 答辩