指標與數組(二)

來源:互聯網
上載者:User

[例6-11]用指標法輸入輸出二維數組各元素。
#include<stdio.h>
main()
{
int a[3][4],*ptr;
int i,j;
ptr=a[0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",ptr++);/*指標的表示方法*/
ptr=a[0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%4d",*ptr++);
printf("\n");
}
}
運行程式:
RUN
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4

6.4.3 數組指標作函數的參數
學習了指向一維和二維數組指標變數的定義和正確引用後,我們現在學慣用指標變數作
函數的參數。
[例6-12] 調用子程式,實現求解一維數組中的最大元素。
我們首先假設一維數組中下標為0的元素是最大和用指標變數指向該元素。後續元素與該
元素一一比較,若找到更大的元素,就替換。子程式的形式參數為一維數組,實際參數是指
向一維數組的指標。
# include <stdio.h>
m a i n ( )
{
int sub_max(); / * 函式宣告* /
int n,a[10],*ptr=a; / *定義變數,並使指標指向數組* /
int max;
f o r ( n = 0 ; n < = i - 1 ; n + + ) / *輸入資料* /
s c a n f ( " % d " , & a [ n ] ) ;
m a x = s u b _ m a x ( p t r , 1 0 ) ; / * 函數調用,其實參是指標* /
p r i n t f ( " m a x = % d \ n " , m a x ) ;
}
int sub_max(b,i) / * 函數定義,其形參為數組* /
int b[],i;
{
int temp,j;
t e m p = b [ 0 ] ;
f o r ( j = 1 ; j < = 9 ; j + + )
if(temp<b[j]) temp=b[j];
return temp;
}
程式的m a i n ( )函數部分,定義數組a 共有1 0個元素,由於將其首地址傳給了p t r,則指標
變數ptr 就指向了數組,調用子程式,再將此地址傳遞給子程式的形式參數b,這樣一來,b
數組在記憶體與a 數組具有相同地址,即在記憶體完全重合。在子程式中對數組b 的操作,與操
作數組a 意義相同。其記憶體中虛實結合的示意如圖6 - 9所示。
m a i n ( )函數完成資料的輸入,調用子程式並輸出運行結果。s u b _ m a x ( )函數完成對數組元
素找最大的過程。在子程式內數組元素的表示採用下標法。運行程式:
R U N
1 3 5 7 9 2 4 6 8 0
m a x = 9
[例6-13] 上述程式也可採用指標變數作子程式的形式參數。
# include <stdio.h>
m a i n ( )
{
int sub_max();
int n,a[10],*ptr=a;
int max;
f o r ( n = 0 ; n < = 9 ; n + + )
s c a n f ( " % d " , & a [ n ] ) ;
m a x = s u b _ m a x ( p t r , 1 0 ) ;
p r i n t f ( " m a x = % d \ n " , m a x ) ;
}
int sub_max(b,i) / *形式參數為指標變數* /
int *b,i;
{
int temp,j;
t e m p = b [ 0 ] ; / *數組元素指標的下標法表示* /
f o r ( j = 1 ; j < = i - 1 ; j + + )
if(temp<b[j]) temp=b[j];
return temp;
}
在子程式中,形式參數是指標,調用程式的實際參數p t r為指向一維數組a的指標,虛實結
合,子程式的形式參數b得到p t r的值,指向了記憶體的一維數組。數組元素採用下標法表示,即
一維數組的頭指標為b,數組元素可以用b [ j ]表示。其記憶體中虛實參數的結合如圖6 - 1 0所示。
運行程式:
R U N
1 3 5 7 9 2 4 6 8 0¿
m a x = 9
[例6-14] 上述程式的子程式中,數組元素還可以用指標表示。
# include <stdio.h>
m a i n ( )
{
int sub_max();
int n,a[10],*ptr=a;
int max;
f o r ( n = 0 ; n < = 9 ; n + + )
s c a n f ( " % d " , & a [ n ] ) ;
m a x = s u b _ m a x ( p t r , 1 0 ) ;
p r i n t f ( " m a x = % d \ n " , m a x ) ;
}
int sub_max(b,i)/ *子程式定義* /
int *b,i;
{
int temp,j;
t e m p = * b + + ;
f o r ( j = 1 ; j < = i - 1 ; j + + )
if(temp<*b) temp=*b++;
return temp;
}

在程式中,指派陳述式t e m p = * b + +;可以分解為:t e m p = * b;b + +;兩句,先作t e m p = * b;後
作b + +;程式的運行結果與上述完全相同。
對上面的程式作修改,在子程式中不僅找最大元素,同時還要將元素的下標記錄下來。
# include <stdio.h>
m a i n ( )
{
int *max();/* 函式宣告* /
int n,a[10],*s,i;
f o r ( i = 0 ; i < 1 0 ; i + + ) / * 輸入資料* /
scanf("%d",a+i);
s = m a x ( a , 1 0 ) ; / *函數調用* /
p r i n t f ( " m a x = % d , i n d e x = % d \ n " , * s , s - a ) ;
}
int *max(a,n) / *定義返回指標的函數* /
int *a,n;
{
int *p,*t; / * p 用於跟蹤數組,t用於記錄最大值元素的地址* /
f o r ( p = a , t = a ; p - a < n ; p + + )
if(*p>*t) t=p;
return t;
}
在m a x()函數中,用p - a < n來控制迴圈結束, a是數組首地址, p用於跟蹤數組元素的地址,p - a正好是所跟蹤元素相對數組頭的距離,或者說是所跟蹤元素相對數組頭的元素個數,所以在m a i n ( )中,最大元素的下標就是該元素的地址與數組頭的差,即s - a。運行程式:
R U N
1 3 5 7 9 2 4 6 8 0¿
m a x = 9 , i n d e x = 4
[例6-15] 用指向數組的指標變數實現一維數組的由小到大的冒泡排序。編寫三個函數用於輸入資料、資料排序、資料輸出。
在第5章的例題中,我們介紹過選擇法排序及演算法,此例再介紹冒泡排序演算法。為了將一組n個無序的數整理成由小到大的順序,將其放入一維數組a [ 0 ]、a [ 1 ]. . .a [ n - 1 ]。冒泡演算法如下:
(開序)
① 相鄰的數組元素依次進行兩兩比較,即a [ 0 ]與a [ 1 ]比、a [ 1 ]與a [ 2 ]比. . . a [ n - 2 ]與a [ n - 1 ]比,通過交換保證數組的相鄰兩個元素前者小,後者大。此次完全的兩兩比較,能免實現a [ n - 1 ]成為數組中最大。
② 餘下n - 1個元素,按照上述原則進行完全兩兩比較,使a [ n - 2 ]成為餘下n - 1個元素中最大。
③ 進行共計n - 1趟完全的兩兩比較,使全部資料整理有序。
下面給出一趟排序的處理過程:

4個元素進行3次兩兩比較,得到一個最大元素。若相鄰元素表示為a [ j ]和a [ j + 1 ],用指標
變數P指向數組,則相鄰元素表示為* ( P + j )和* ( P + j + 1 )程式實現如下:
# include<stdio.h>
#define N 10
m a i n ( )
{
void input(); / *函式宣告* /
void sort();
void output();
int a[N],*p; / *定義一維數組和指標變數* /
i n p u t ( a , N ) ; / *資料輸入函數調用,實參a是數組名* /
p = a ; / *指標變數指向數組的首地址* /
s o r t ( p , N ) ; / *排序,實參p是指標變數* /
o u t p u t ( p , N ) ; / *輸出,實參p是指標變數* /
}
void input(arr,n) / *無需傳回值的輸入資料函數定義,形參a r r 是數組* /
int arr[],n;
{
int i;
printf("input data:\n");
for ( i = 0 ; i < n ; i + + ) / *採用傳統的下標法*/
s c a n f ( " % d " , & a r r [ i ] ) ;
}
void sort(ptr,n) / *冒泡排序,形參ptr 是指標變數* /
int *ptr,n;
{
int i,j,t;
for ( i = 0 ; i < n - 1 ; i + + )
for ( j = 0 ; j < n - 1 - i ; j + + )
if (*(ptr+j)>*(ptr+j+1))/相*臨兩個元素進行比較*/
{
t = * ( ptr + j ) ; / *兩個元素進行交換* /
* ( ptr + j ) = * ( ptr + j + 1 ) ;
* ( ptr + j + 1 ) = t ;
}
}
void output(arr,n) / *資料輸出* /
int arr[],n;
{
int i,*ptr=arr; / *利用指標指向數組的首地址* /
printf("output data:\n");
for ( ; ptr - a r r < n ; ptr + + ) / *輸出數組的n個元素* /
printf ( " % 4 d " , * ptr ) ;
printf ( " \ n " ) ;
}

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。