語言-課件c7指針_第1頁
語言-課件c7指針_第2頁
語言-課件c7指針_第3頁
語言-課件c7指針_第4頁
語言-課件c7指針_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

12020/11/25c程序設(shè)計指針類型就是用來存放地址的變量類型如果

希望變量p用來存放地址值,那么就必須將p

定義為指針類型。反之,如果p為指針類型的變量,p只能存放地址值,而不能存放其他類型的數(shù)據(jù)。指針22020/11/25c程序設(shè)計例:用指針型變量

pa來存放變量a的地址。通過pa

a,先找到變量pa,得到

pa

的值為2000→

變量a的地址再到地址為2000的

單元中取得a

的值。6指針變量paa2000間接尋址200032020/11/25c程序設(shè)計指針變量的定義定義格式指向的類型說明符

*指針變量名;例:

int

*pt;*

—指針類型標記。pt

—指針變量名int—pt是指向整數(shù)類型的指針變量。42020/11/25c程序設(shè)計定義指針變量,指向整數(shù)類型;int

*p1;定義指針變量,指向?qū)崝?shù)類型;float

*p2;定義指針變量,指向雙精度類型;double

*p3;定義指針變量,指向字符類型;char

*p4;除此之外,還可以定義指向數(shù)組的指針變量、指向函數(shù)的指針變量、指向結(jié)構(gòu)體的指針變量等。52020/11/25c程序設(shè)計指針變量運算符&

:取變量地址;*

:取指針所指的變量的值;62020/11/25c程序設(shè)計閱讀程序:void

main(){int

a,

k=4,

*p1;p1=

&k;a=(*p1)+7;printf("a=%d\n",

a);}akp120002000到4p1中找到地址,然后到該地址中取值41172020/11/25c程序設(shè)計一、普通指針變量與函數(shù)82020/11/25c程序設(shè)計指針變量存放的是地址值,可以作為函數(shù)的參數(shù)來進行"地址傳送";實際參數(shù)可以是地址常量或指針變量;形式參數(shù)則為指針變量。92020/11/25c程序設(shè)計例1:

用函數(shù)來實現(xiàn)兩個數(shù)的交換。#include <stdio.h

>void

main(){

int

a

=

3,b

=

5;void

swap(

int

x,

int

y);printf("交換之前

");printf("a=%d,b=%d\n",a,

b);swap(a,b);printf("交換之后

");printf("a=%d,b=%d\n",a,

b);}void

swap(int

x,int

y

){inttemp;temp=x;x

=

y;y=

x;}102020/11/25c程序設(shè)計c程序設(shè)計例:

用函數(shù)來實現(xiàn)兩個數(shù)的交換。#include <stdio.h

>void

main(

){

int

a

=

3,b

=5;int

*pa=&a,*pb=&b;

printf("交換之前

:");printf("a=%d,b=%d\n",a,b);swap(pa,pb);printf("交換之后

:");printf("a=%d,b=%d\n",a,b);printf("*pa=%d,*pb=%d\n",

*pa,*pb);}void

swap(int

*p1,int

*p2

){

int

temp;temp

=

*p1;*p1

=

*p2;*p2

=

temp;

}void

swap(

int

*p1,int

*p2){

int

temp;temp

=

*p1;*p1=

*p2;

*p2

=

temp;

}p1p2temp*p

(a)*p2(b)&b&a353122020/11/25c程序設(shè)計swap()能否寫成下面的形式呢?swap

(int

*p1,int

*p2){

int

*p;p

=p1;p1

=p2;p2=p;}這個程序能否實現(xiàn)兩個變量內(nèi)容的交換?132020/11/25c程序設(shè)計結(jié)論:當你需要在子函數(shù)中,將主函數(shù)內(nèi)的變量值進行改變時,需要:將子函數(shù)的形式參數(shù)定義成:指針類型對應(yīng)的實在參數(shù)應(yīng)該是:對應(yīng)變量的地址142020/11/25c程序設(shè)計練習(xí):寫一個函數(shù),求一元二次方程的兩個實根。編程要求:系數(shù)a,

b,

c由主函數(shù)傳入。方程的根由參數(shù)傳回主函數(shù)152020/11/25c程序設(shè)計函數(shù)程序:root{( int

a ,int

b ,int

c

,do)uble*x1double

delta;delta=sqrt(b*b-4*a*c);*x1

=

(-b+delta)/(2*a);*x2

=

(-b-delta)/(2*a);,double

*x2}162020/11/25c程序設(shè)計}2020/11/25c程序設(shè)計17主函數(shù):if(d>==0)printf("x1=%f,x2=%f\n",x1,x2);求調(diào)ro用ot

(void

main(){

inta ,

b ,

c;

double

x1 ,

x2,d;printf("請輸入方程的系數(shù)a,b,c:");scanf("%d%d%d",&a,&b,&c);d=b*b-4*a*c;調(diào)用求根函數(shù)a,b

,c

,&x1,&x2二、指針和數(shù)組182020/11/25c程序設(shè)計數(shù)組名是一個地址常量;計算機系統(tǒng)在處理數(shù)組時,在一個內(nèi)存區(qū)域中,為數(shù)組分配一片連續(xù)的空間,并把這片區(qū)域的首地址值存入數(shù)組名中數(shù)組名是一個基類型為數(shù)組元素的基類型的地址常量。指針類型變量可以被賦予同類型的數(shù)組名的值;192020/11/25c程序設(shè)計1.一維數(shù)組與指針202020/11/25c程序設(shè)計int

A[8];意味著:A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A區(qū)的首地址,基礎(chǔ)類型為intA的值是這片int

*p;意味著:p是一個指針變量,可以存放int型數(shù)據(jù)的首地址所以:

p

可以

指向

A

的每一個數(shù)組元素212020/11/25c程序設(shè)計指向數(shù)組的第i個元素:p=&A[i];p=&A[0];語句格式:指向數(shù)組的第一個元素:p=A;

或222020/11/25c程序設(shè)計用指針變量操作數(shù)組元素:用數(shù)組名操作數(shù)組元素:A[i];

*A*(A+i)用指針變量操作數(shù)組元素:p[i];

*p*(p+i)232020/11/25c程序設(shè)計p++,++p:/*使p指向數(shù)組的后一個元素

*/p--,--p:/*使p指向數(shù)組的前一個元素*/p+n:p-n:p-q:/*使p往后移n個元素*//*使p往前移n個元素*//*求指針變量p和q之間元素的個數(shù),且q>p

*/6.

p+q:/*兩個地址相加,無意義,不允許*/指針運算:242020/11/25c程序設(shè)計舉例252020/11/25c程序設(shè)計void

main(){int

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

*p;p=A;printf("%d,",*p);printf("%d\n",*++p);}AA[0]

A[1]

A[2]

A[3]

A[4]

A[5]123456p&A[0]&A[0]262020/11/25c程序設(shè)計2020/11/25c程序設(shè)計例:編函數(shù)求一個3×4矩陣中的最大的元素,同時返回最大值在矩陣中的位置。定義函數(shù):largest

(

float

a[3][4]數(shù)據(jù)描述:,)

int

*row

,int

*colmax

表示最大值函數(shù)實現(xiàn):1)將a[0][0]

送給max;row

表示最大元素所在的行column表示最大元素所在的列*row=0;

*col=0

;2)從數(shù)組的第0行第0列開始,逐個與

max

進行比較,如果某個數(shù)組元素比max大,將該數(shù)組元素送入max中,同時記錄行下標和列下標;函數(shù):largest(}float

a[3][4],)

int

*row,int

*colint i

,

j

;{float

max;max=a[0][0];*row=0;

*column

=0;for

(

i=0

;

i<3;

i++)for(j

=0;

j<4;

j++

)if(a[i][j]>max){

max=a[i][j];

*row=i;*column=j;

}return

(max);給對應(yīng)的實參賦值給對應(yīng)的實參賦值指針型參數(shù)主函數(shù):largest(void

main

(){}int

i,j,row,col;scanf

("%,

&a[i][j]);float

a[3]

[4],

Max;for

(

i=0;

i<3;

i++)for

(

j=0;

j<4;

j++)Max=

largest(

a ,

&r)float

a[3][4],int

*row,int

*col主函數(shù)中的printf

("the

largest

one

is

行:\n數(shù),和M列a數(shù)x)

;printf

("row=%d,col=%d

:\n",

row,col)

;練習(xí):1、寫一個函數(shù)sort:對一個有n個元素的一維數(shù)組進行排序2、主函數(shù)完成原始數(shù)據(jù)的輸入,調(diào)用函數(shù)sort,實現(xiàn)將一組無序的數(shù)據(jù)從小到大排序,并輸出。302020/11/25c程序設(shè)計指針變量運算:int a[10],*p

,i;p

=

a;p++:使p指向下一個元素*p++:等價于*(p++),先得到*p,p后移*(p++)與*(++p)的區(qū)別:*(p++):先取*p,后移p

;*(++p):先向后移動p,后得到*p;4)++(*p):p所指向的內(nèi)存單元的值加1312020/11/25c程序設(shè)計字符串與指針322020/11/25c程序設(shè)計C

語言用兩種方法實現(xiàn)一個字符串用字符數(shù)組實現(xiàn)。例如:static

char str[]

=

"C

language";用字符指針實現(xiàn)。例如:char *pstr

=

"C

language";如下寫法正確嗎?char *pstr

;pstr

=

"C

language";字符串的表示形式332020/11/25c程序設(shè)計定義一個字符型數(shù)組,對它初始化,然后輸出它#include<stdio.h>void

main(){char

string[]="I

love

china!";printf("%s\n",string);}342020/11/25c程序設(shè)計用一個字符指針指向一個字符串,對它初始化,然后輸出它#include<stdio.h>void

main(){char

*string="I

love

china!";printf("%s\n",string);}352020/11/25c程序設(shè)計c程序設(shè)計寫一個函數(shù),輸入一行字符,輸出最長的單詞。#include<stdio.h>#include<string.h>void

wordedit

(

char

ch1[80],

char

word[20]){int

i

=0

,k

,

j,

max=0; char

temp[20];while(

ch1[i]

!=‘

&&

ch1[i]

!=‘\0’){ word

[i]=ch1[i];

i++;

max++;

}word

[i]='\0';while(

ch1[i]

!='\0')

{k=0;while(ch1[i]

!='\0'&&ch1[i]

!='

'){

temp[k]=ch1[i];

i++;

k++;

}if(k>max){for

(j=0;j<k;

j++)

word

[j]=temp[j];max=k;

word[k]='\0';

}if(ch1[i]

!='\0')

i++;}}372020/11/25c程序設(shè)計void

main(){char

ch[80],

word[20];puts("please

input

a

string:

");gets(ch);wordedit(ch,word);puts(ch);puts(word);}382020/11/25c程序設(shè)計練習(xí)392020/11/25c程序設(shè)計1.輸出字符串中的部分數(shù)據(jù)void

main(){char

str[80];char

*s1

=str;s1=

"C

language";s1+

=2;printf("%s\n",s1);}程序運行結(jié)果如下:language402020/11/25c程序設(shè)計下列程序段是用來判斷數(shù)組中特定元素的位置所在。則輸出結(jié)果為:int

fun(int

*s,

int

t,

int*k){ int

i;

*k=0;for(i=0;i<t;i++)if(s[*k]<S[i])*k=i;return

s[*k];

}void

main(){ int

a[10]={

876,675,896,101,301,401,980,431,451,777},k;fun(a,

10,

&k);printf("%d,

%d\n

",

k,

a[k]);

}412020/11/25c程序設(shè)計下面程序段的運行結(jié)果是:#define

N

10#define

M

10char

*find

(

char

(*a)[M],

int

n){

char

*q; inti;

q=a[0];for(i=0;i<n;i++)if

(

strcmp(a[i],

q)

<

0

)

q=a[i];return

q;}void void

main(){

char s[N][M]

={"tomeetme",

"you",

"and",

"he",

"china"};char

*p; int

n=5,

i;

p=find(s,n);

puts(p);

}422020/11/25c程序設(shè)計2有一行字符,要求刪去指定的字符。#include<stdio.h>void void

main(){ void

del_ch(char

*p

,char

ch);char

str[80]

, *pt

,

ch;printf("請輸入一個字符串:\n");gets(str); pt

=str;printf("請輸入要被刪除的字符:\n");ch

=

getchar();

del_ch(pt,ch);printf("新的字符串為:\n%s\n",str);}void

del_ch(char

*p,

char

ch){char

*q

=

p;for(

;

*p

!=

‘\0’;

p++)if(

*p

!=

ch

) *q++

=

*p;*q

=

'\0';}442020/11/25c程序設(shè)計#define

M

100void fun(int

m,

int

*a,

int

*n){

int i,

j=0;for(

i=1;

i<=m; i++

)if(

i%7==0

||

i

==0

)

a[j++]=i;*n=j;

}void void

main(){

int aa[M],

n,

k;

fun(10,aa,&n);for(

k=0;

k<M;

k++)if( k+1==

0) printf(

"\n“

);else printf

(

"%6d",

aa[k]);printf(

"\n"

);

}452020/11/25c程序設(shè)計3.

將若干字符串按字母順序輸出。#include<stdio.h>#include

<string.h>void

main(){void

sort(char

*name[]

,

int

n);void

print(char

*name[]

,int

n);char

*name[]={"BASIC","FORTRAN","PASCAL","COBOL"};int

n

=

4;sort

(

name

,

n

);print

(

name

,

n);}462020/11/25c程序設(shè)計void

print(char

*name[]

,int

n){int

i;for(

i

=

0

;

i

<

n

;

i++)printf("%s\n"

,

name[i]);}472020/11/25c程序設(shè)計void

sort(char

*name[]

,

int

n)

{char

*temp; int

i

,

j

,

k;for(

i=0;

i<n-1;

i++){ k

=

i;for

(

j

=

i

+

1

;

j

<

n

;

j++)if(

strcmp(name[k],

name[j])>0) k

=j;if

(

k

!=

i

)

{strcpy(temp,name[i]);strcpy(name[i],name[k]);strcpy(name[k],temp);

}}}482020/11/25c程序設(shè)計void

main(){char

*p1="abc",*p2="ABC",str[50]=

"xyz";strcpy(str+2,strcat(p1,p2));printf("%s\n",str);}492020/11/25c程序設(shè)計下面程序段的運行結(jié)果是:void

main(){char

ch[2][5]={"6937"

,

"8254"},

*p[2];int i,

j,s=0;for(

i=0;

i<2;

i++)

p[i]=ch[i];for(

i=0;

i<2;

i++)for(

j=0;

p[i][j]

>'\0';

j+=2)s=10*s

+

p[i][j]

-

'0';printf("%d\n",s);}502020/11/25c程序設(shè)計指針數(shù)組一、指針數(shù)組的定義

二、指針數(shù)組的初始化三、指針變量512020/11/25c程序設(shè)計指針數(shù)組的定義格式:類型標識符

*數(shù)組名[常量表達式]例:int

*a[4];定義了一個有4個元素的一維數(shù)組;數(shù)組的每個分量都是一個指向整型的指針;int *a[4];等同于int

*(a[4]);522020/11/25c程序設(shè)計指針數(shù)組的定義注意:[]

的運算優(yōu)先級高于

*,如果寫成int

(*a)[4];定義了一個行指針變量

a,指向有

4個元素的一維數(shù)組。532020/11/25c程序設(shè)計指針數(shù)組的初始化指針數(shù)組的初始化就是在定義指針數(shù)組時給其數(shù)組元素賦值;例:char

*p[]={" o",

"Why","Thanks"};指針數(shù)組的初值必須是地址;542020/11/25c程序設(shè)計將10個學(xué)生的

按從小到大的順序輸出。#include

"stdio.h"void sort(

char

*pc[],

int n

);void

main(){char

*p[10]; int

i;i++)s

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論