




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單元七
指針導學【問題】
定義一個整型變量a,如何知道分配給變量a的存儲空間的地址編碼是多少?如何通過指針對變量a進行操作?2指針變量的應用目錄1如何定義指針變量7.1.1內存地址與指針(1)內存地址
在計算機中,內存空間的最小單位為字節,操作系統會為每個字節的內存空間進行編號,這個編號就是內存地址。變量存儲空間的第一個字節對應的內存地址可看作是存儲地址。
內存空間10001001內存地址inta;//占用4個字節charc;//占用1個字節1002100310047.1.1內存地址與指針(2)指針與指針變量
根據存儲地址可以訪問相應的存儲單元,所以通常也把地址稱為指針。C語言允許定義一個變量來存放指針,這種變量就稱為指針變量。1000P110001001內存地址10021003指針變量
內存空間charc;//占用1個字節inta;//占用4個字節1001P210047.1.2指針變量的定義與初始化(1)指針變量的定義定義指針變量的一般格式:
類型名
*變量名;類型名:表示該指針變量只能保存該類型變量的指針。*:表示該變量是指針變量,只能保存地址數據。變量名:表示指針變量的名稱,變量名的命名需遵循標識符命名規則。int*p1;//p1是指向整型數據的指針變量char*p2;//p2是指向字符型數據的指針變量7.1.2指針變量的定義與初始化(2)指針變量的初始化第一種:定義指針變量的同時進行初始
第二種:先定義指針變量,然后再進行初始
int*p=NULL;//指針初始化為空inta=5;//定義整型變量aint*p;//定義指針變量p
p=&a;//p指向變量aint*p=&a;等價于7.1.3指針變量的引用指針變量的運算符有兩個:“*”和“&”。“*”是指針運算符,也稱為間接引用操作符,它返回指針指向的變量的值。“&”是取地址運算符,它返回運算對象的內存地址。inta=5,b,*p;p=&a;//指針變量p指向a的地址b=*p;//將p所指向變量a的值賦給b注:定義指針變量和引用指針變量都有符號“*”,但含義不同,前者是指針類型的
表示符,表示p是一個指針變量,后者表示指針變量所指向的變量。7.1.3指針變量的引用#include<stdio.h>intmain(){
inta=5;
//定義整型變量a,并進行初始化
int*p1,*p2;//定義兩個指針變量p1、p2
p1=&a;//對p1進行初始,p1指向變量a
p2=p1;
//將指針變量p1的值賦給p2,p2指向變量a
printf("*p1=%d\n*p2=%d",*p1,*p2);
return0;}【例7-1】對指針變量的操作運行結果:7.1.3指針變量的引用#include<stdio.h>intmain(){
inta=5;
int*p1,*p2;
p1=&a;
p2=p1;
printf("*p1=%d\n*p2=%d\n",*p1,*p2);
scanf("%d",p1);//輸入10
printf("*p1=%d\n*p2=%d\n",*p1,*p2);
return0;}【例7-2】對指針變量指向的變量的操作運行結果:7.1.3指針變量的引用#include<stdio.h>voidswap(int*p1,int*p2)//自定義函數swap{
inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;}intmain(){
inta=5,b=10;
printf("a=%db=%d\n",a,b);
swap(&a,&b);//調用自定義函數
printf("a=%db=%d\n",a,b);
return0;}【例7-3】利用自定義函數交換兩個變量的值運行結果:7.1.3指針變量的引用#include<stdio.h>voidswap(inta,intb){
inttemp;
temp=a;
a=b;
b=temp;}intmain(){
inta=5,b=10;
printf("a=%db=%d\n",a,b);
swap(a,b);
printf("a=%db=%d\n",a,b);
return0;}【思考】以下以下程序是否可以完成兩個變量值的交換運行結果:1如何定義指針變量目錄2指針變量的應用7.2.1一維數組與指針(1)建立指針與數組的關系p=a;inta[5];int*p;//建立數組a與指針p之間的關系等價于p=&a[0];如何建立數組a與指針p之間的關系?p
p+1
a+1p+2
a+2p+3
a+3p+4
a+4a[1]a[0]a[2]a[3]a[4]
數組a[5]a內存單元7.2.1一維數組與指針(2)指針運算數組名a表示數組的初始地址,p指向數組的第一個元素a[0],p+1指向下一個數組元素a[1]。p+1、p-1并不是數學中計算,而是表示移動一個“單元”,對于int類型來講,p和p+1相差4個字節,若數組的初始地址為1000,那么p+1的值為1004。地址間關系:&a[0]<==>a<==>p;&a[i]<==>a+i<==>p+i;元素間關系:a[0]<==>*a<==>*p;a[i]<==>*(a+i)<==>*(p+i);p
p+1
a+1p+2
a+2p+3
a+3p+4
a+4a[1]a[0]a[2]a[3]a[4]
數組a[5]a內存單元7.2.1一維數組與指針(3)利用指針變量訪問數組#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};inti;
int*p;
p=a;
for(i=0;i<=4;i++)
{
printf("元素a[%d]的地址:%p,值為:%d\n",i,p+i,*(p+i));
}
return0;}【例7-5】利用指針變量p訪問數組a7.2.1一維數組與指針#include<stdio.h>voidmax(int*p,intn){
inti,max=*p;
for(i=0;i<n;i++)
{
if(max<*(p+i))
max=*(p+i);
}
printf("最大值為%d",max);}intmain(){
inta[5]={1,2,3,4,5};max(a,5);
return0;}【例7-6】利用指針變量p尋找數組a中的最大值7.2.2二維數組與指針(1)二維數組中所蘊含的地址關系inta[3][3]={1,2,3,4,5,6,7,8,9};二維數組a由3個元素組成:a[0]、a[1]、a[2]a[0]包含有
3
個元素:a[0][0]、a[0][1]、a[0][2]a[0]a[1]a[2]123456789a7.2.2二維數組與指針(1)二維數組中所蘊含的地址關系a代表二維數組的首地址,也是二維數組第0行的首地址。a+1代表第1行的首地址。aa+1a+210001個整型變量占4個字節,一行12占用個字節10121024a[0]a[1]a[2]1234567897.2.2二維數組與指針(1)二維數組中所蘊含的地址關系a[0]代表二維數組第0行的首地址,a[i]代表第i行的首地址。a[0]也代表第0行第0個元素地址,a[0]+i代表第0行的第i個元素地址。123456789a[0]1000a[0]+1a[0]+2a[1]a[2]7.2.2二維數組與指針(1)二維數組中所蘊含的地址關系二維數組元素a[i][j]的地址以及值的表示歸納總結為:地址表示方法:&a[i][j]<==>a[i]+j<==>*(a+i)+j值表示方法:a[i][j]<==>*(a[i]+j)<==>*(*(a+i)+j)7.2.2二維數組與指針(2)指針在二維數組中的應用---指針數組定義:數組元素全為指針變量的數組稱為指針數組,指針數組中的元素都必須具有相同的存儲類型、指向相同數據類型的指針變量。指針數組定義的一般格式:int*p[n];
注意:[]優先級高,先與p結合成為一個數組,再由int*說明這是一個整型指針數組,它有n個指針類型的數組元素,為p[0]、p[1]、p[2]...p[n-1],而且它們都是指針變量,用來存放變量地址。7.2.2二維數組與指針【例7-7】利用指針數組遍歷二維數組a[3][3]={1,2,3,4,5,6,7,8,9}#include<stdio.h>intmain(){
inta[3][3]={1,2,3,4,5,6,7,8,9};int*p[3];//定義一個指針數組inti,j;
for(i=0;i<3;i++)
p[i]=a[i];
//數組指針賦初值,為二維數組每行地址
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d",*(p[i]+j));
printf("\n");}
return0;}運行結果:(2)指針在二維數組中的應用---行指針定義:行指針也稱為數組指針,指的是數組名的指針,即數組首元素地址的指針。行指針定義的一般格式:int(*p)[n];()優先級高,首先說明p是一個指針,指向一個整型的一維數組,這個一維數組的長度是n,可以說是p的步長。當執行p+1時,p要跨過n個整型數據的長度。7.2.2二維數組與指針7.2.2二維數組與指針【例7-7】利用行指針遍歷二維數組a[3][3]={1,2,3,4,5,6,7,8,9}#include<stdio.h>intmain(){
inta[3][3]={1,2,3,4,5,6,7,8,9};
int(*p)[3];//定義一個行指針p,指向一個二維數組,[3]表示指針指向的行包含的元素個數
inti,j;p=a;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d",*(*(p+i)+j));
printf("\n");}
return0;}運行結果:7.2.3字符串與指針“helloworld!"
由雙引號括起來的字符序列
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45410.3-2025光學和光子學望遠鏡系統試驗方法第3部分:瞄準望遠鏡
- 家長課堂課題申報書
- 微生物群落分析的方法與應用試題及答案
- 英文合同權利義務轉讓協議
- 模擬習題2025年證券從業資格證考試試題及答案
- 耐力跑課題申報書
- 重點內容梳理的證券從業資格證試題及答案
- 外部合作伙伴開發計劃
- 大班團隊活動安排計劃
- 醫療器械科個人工作計劃
- 工貿企業負責人安全培訓
- 《陪診從業人員能力培訓標準》
- 2025年極兔速遞有限公司招聘筆試參考題庫含答案解析
- 《氫氣輸送管道工程設計規范》
- 管網工程施工重難點分析及對應措施
- 2024ESC心房顫動管理指南解讀-完整版
- DB51T 2943-2022 四川省一體化政務服務平臺系統接入規范
- 飛機空氣動力學課件:翼型的空氣動力特性
- 《地方鐵路運輸企業安全生產標準化建設規范》
- 農業科技的智能灌溉
- 森林防火護林員聘用合同
評論
0/150
提交評論