程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 指針與數組(二)

指針與數組(二)

編輯:關於C語言

[例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 " ) ;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved