第一篇:C語言程序設計實驗十指針
C語言程序設計實驗十——指針
【實驗1】
實驗題目:
1、下列代碼片段哪里有錯誤?
char var1,ptr1;
var1 = ?x?;
ptr1 = &var1;
2、設有如下定義:
Double var1, *ptr1, *ptr2;
Float* ptr3;
Int var2, *var4;
那么,var1, *ptr1, ptr2,*ptr2,ptr3,* ptr3,var2, var4,*var4個屬于哪種數據類型?
3、下列代碼片段在哪里有錯誤?
Char c = ? A ?;
Char * p;
p = c;或*p=?A?;
4、下列代碼片段的輸出結果是什么?
charvar1 = ? S ?;
charvar2 = ? X ?;
char*ptr1, *ptr2;
ptr1 = &var1;
ptr2 = &var2;
*ptr2 = *ptr1;
printf(“%ct%cn”, *ptr1, var2);
【實驗2】
實驗題目:輸入3個整數,按由小到大的順序輸出。
【實驗3】
實驗題目:輸入10個整數,將其中最小的數與第一個數對換,把最大的數與最后一個數對換。
實驗要求:寫3個函數:(1)輸入10個數;(2)進行處理;(3)輸出10個數。
【實驗4】輸入年和天數,輸出對應的年、月、日。
例如:輸入2000和61,輸出2000-3-1。
要求:都用指針實現。
第二篇:C語言程序設計實驗七:函數、數組、指針
C語言程序設計實驗七:函數、數組、指針
1、程序運行后,用戶任意輸入一個字符串,求出字符串長度,然后輸出字符串內容及個 數。不能使用strlen函數。
求字符串長度函數的函數原型必須如下:
int MyStrLenPt(char *str)
若輸入:nihao123!
則輸出:nihao123!:9 chars2、編寫一個對一維數組進行排序的程序。
要求:
寫兩個函數,一個主函數,一個sort函數。在主函數中完成數組的輸入和輸出,通過調 用sort函數對數組進行排序。
sort函數的原型為:voidsort(int*p, intn);
說明:
(1)請大家按學號來坐,便于考勤和管理。
(2)請珍惜寶貴的實驗時間!不要做與實驗無關的事情,比如聊QQ、上網或打游戲。
(3)直接把C語言代碼粘貼到相應的實驗題目下方,上交實驗報告時只交word文檔。
(4)文檔名稱:班級+學號后2位+姓名+實驗編號,例如11電1班12張山實驗七.doc。
第三篇:C語言程序設計教案 第十章指針
第十章 指 針
課題:
教學目的: 教學重點: 教學難點: 第十章 指針
§1-§2
1、了解指針與地址的概念
2、掌握指針變量的定義、初始化及指針的運算 指針變量的定義、初始化及指針的運算
指針的運算
步驟一 復習引導
指針是C語言的一個重要概念,也是C語言的一個重要特色。正確而靈活地運用它,可以有效地表示復雜的數據結構;能動態分配內存;能方便地使用字符串;有效而方便地使用數組;在調用函數時能得到多于1個的值;能直接處理內存地址等,這對設計系統軟件是很必要的。
指針的概念比較復雜,使用也比較靈活,因此初學者時常會出錯,務請在學習本章內容時十分小心。
步驟二 講授新課
§10.1 地址和指針的概念
計算機的主存儲器被分成一個個存儲單元,為了區分各存儲單元,要為每個存儲單元編號,這個編號即地址。
例:i =3;
或 scanf(“%d”, &i);
是將3送給 i所在的空間。
例:將3送到變量I_pointer所“指向”的單元(即I所標志的單元)。
所謂“指向”,是通過地址來體現的,I_pointer中的值為2000,它是變量I 的地址,這樣就在I_pointer和變量之間建立起一種聯系,即通過I_pointer能知道I的地址,從而找到變量I的內存單元。因而在C語言中,將地址形象化地稱為“指針”。
意思是通過它能找到以它為地址的內存單元。一個變量的地址稱為該變量的“指針”。
內存單元的地址和內存單元的內容是兩個不同的概念。
指針:就是地址,即內存單元的編號。
指針變量:用來存放另一變量的地址(即指針)的變量。
如:地址2000是變量 i的指針;i_pointer是指針變量,其值就是指針2000。
§10.2變量的指針和指向變量的指針變量
變量的指針就是變量的地址。
存放變量地址的變量是指針變量,用來指向另一個變量。
*i_pointer 表示 i_pointer 所指向的變量。
一、定義一個指針變量
指針變量的定義包含三個方面的內容:
⑴ 指針類型說明,即定義變量為一個指針變量 ⑵ 指針變量名
⑶ 變量值(指針)所指向的變量的數據類型。格式:
存儲類型
基類型
*指針變量名;例:int *pointer_1, *pointer_2;
float *pointer_3;
char *pointer_4;
二、指針的引用
指針變量有兩個運算符: & :取地址運算符
功能:取變量地址;單目,右結合。
* :取內容運算符(“間接訪問”運算符)
功能:只能跟地址,取變量所指向單元的內容;單目,右結合。
例:&a為變量a的地址,*p 為指針變量p所指向的存儲單元。
例:int a=5, *p=&a;
printf(“%d”, *p);main(){ int a,b;
int *pointer_1,*pointer_2;
a=100;b=10;
pointer_1=&a;
/*把變量a的地址賦給pointer_1*/
pointer_2=&b;
/*把變量b的地址賦給pointer_2*/
printf(“%d,%dn”,a,b);
printf(“%d,%dn”,*pointer_1, *pointer_2);} 輸出結果:100, 10
100, 10
評注:
1、在第3行雖然定義了兩個指針變量,只是提供了兩個指針變量,但并未指向任何一個整型變量。稱為指針“懸空”。
2、最后一行的*pointer_1和pointer_2就是變量a和b。
3、程序中兩處出現*pointer_1等,含義不同。程序第3行中的*pointer_1表示定義指針變量pointer_1。它前面的*只是表示該變量是指針變量。程序最后一行中的*pointer_1則代表變量,即pointer_1所指向的變量。
4、第5行中的pointer_1=&a 是將a的地址賦給指針變量pointer_1,而不是*pointer_1。
注意:不應寫成:*pointer_1=&a;
5、從上例中可看出,*pointer_1等價于a,*pointer_2等價于b,故凡在程序中出現a的地方均可用 *pointer_1 代替。所以,若有: int x, y, *px=&x;則下面的運算均是正確的: y=*px+1;
/*把 x 的內容加1 送變量y*/ printf(“%dn”, px);
/*打印當前x 的內容*/ d=sqrt((double)px);
/*把x的平方根送變量d*/ px=0;
/*把 x 置為0*/ *px+=1;
/*把 x 的值加 1*/(*px)++;
/*使 x 的值加 1*/ y=(*px)++;
/*即y=x, x++*/
6、假設px和py都被定義為指向int 對象的指針,而且px當前已指向了int 型變量x,則執行:
py=px;
/*把指針px的內容拷貝到指針py中去*/ 即
py和px 這兩個不同的指針指向了同一對象x
7、指針不是整數,不能將它與整數混為一談。例:
# include
例如:
# include
b = d;
printf(“%d n”, b);
……
}——編譯不出錯,但得不到希望的值
關于&和*運算符的說明:
假設已執行
pointer_1=&a;
1、&*pointer_1含義是什么?
&*pointer_1與&a相同,即變量a的地址。
2、*&a的含義是什么?
先進行&a運算,得a的地址,再進行*運算。
*&a、*pointer_1及變量a等價。
3、(*pointer_1)+ + 相當于a + +。
它與*pointer_1 + + 不同。
4、*pointer_1 + + 等價于*(pointer_1 + +),即先進行*運算,得到a的值,然后使pointer_1的值改變,這樣pointer_1不再指向a了。
例10.2:輸入a和b兩個整數,按先大后小的順序輸出a和b。
main(){ int *p1,*p2,*p, a, b;
scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a
{p=p1;p1=p2;p2=p;}
printf(“n a=%d,b=%dn”,a,b);
printf(“max=%d,min=%dn”,*p1,*p2);
} 運行情況: 5,9
三、指針變量作為函數參數
例10.3對輸入的兩個整數按大小順序輸出。先考察如下程序,看是否能得到預期的結果
swap(int p1, int p2){ int temp;temp = p1;p1 = p2;p2 =temp;} main(){ int a, b;
scanf(“%d, %d”, &a, &b);
if(a
printf(“n%d,%dn”,a,b);} 不能得到預期的結果。改為:
swap(int *p1,int *p2){ int temp;
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
swap(pointer_1,pointer_2);
printf(“n%d,%dn”,a,b);}
注:如果想通過函數調用得到n個改變的值,可以:
1、在主調函數中設n 個變量,用n個指針變量指向它們;
2、然后將指針變量作實參,將這n 個變量的地址傳給所調用的函數的形參;
3、通過形參指針變量,改變該n個變量的值;
4、主調函數中就可以使用這些改變了值的變量。
四、指針(變量)的初始化 指針置初始化值的格式:
存儲類型
基類型
*指針名=初始化值; 如:main()
{ static int a;
int *p=&a, *p1=p;
…… } 再如: int *p = 0;
或
int *p = NULL;
五、指針的運算
1、指針的算術運算
指針僅能進行加、減算術運算
如:p+n , p-n , p++ , p--, ++p ,--p
p-= n , p+= n , p1-p2 等 其中n是整數,p、p1、p2均為指針;
施行加法運算時,指針向地址增大的方向移動; 施行減法運算時,指針向地址減小的方向移動; 移動長度取決于指針的基類型,由計算機決定; 如有:int a,b,c, *pt =&a;
則
pt++ 則指針向后移動兩個字節; 再如:main()
{ int *p1,a=8,b=3;
p1=&a;
printf(“%d,%dn”,(*p1)++, *p1++);
printf(“%d,%dn”,a, *p1);
} 運行結果:3,8,4 注:p1+k = p1+k*sizeof(p1的基類型);
p1-k = p1-k*sizeof(p1的基類型);如:
strlen(char *s)
{ char *p=s;
while(*p!=? 主站蜘蛛池模板: 欧美肥婆姓交大片| 国产乱码一区二区三区免费| 国产精品女同久久久久电影院| 芙宁娜被??黄漫扒衣服| 久久精品国产99久久久小说| 国产精品成人一区二区三区| 一二三四在线观看视频韩国| 中日产幕无线码一区| 久久综合九色综合久99| 国产精品无码久久久久久| 欧美人与zoxxxx另类| 日本在线视频www鲁啊鲁| 人人妻人人做人人爽精品| 人妻人人看人妻人人添| 日本丰满熟妇videossex8k| 好男人在线社区www在线播放| 亚洲国产av无码男人的天堂| 极品少妇一区二区三区四区| 奇米影视色777四色在线首页| 久久精品国产自在天天线| 无码av免费毛片一区二区| 欧美老妇交乱视频在线观看| 无码国内精品久久人妻| 亚洲精品国产第一综合99久久| 人妻 丝袜美腿 中文字幕| 真人与拘做受免费视频| 亚洲偷自拍另类图片二区| 成人一区二区免费中文字幕视频| 日韩国产亚洲一区二区三区| 人人妻人人爽人人做夜欢视频九色| 国产男女无遮挡猛进猛出| 免费a级毛片在线播放不收费| 在线观看特色大片免费视频| 天堂av无码大芭蕉伊人av不卡| 日本高清va在线播放| 色吊丝永久性观看网站| 丰满岳妇乱一区二区三区| 妇女性内射冈站hdwwwooo| 少妇又色又紧又爽又刺激视频| 99热久久精里都是精品6| 色欲av蜜桃一区二区三|