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

指針與數組(三)

編輯:關於C語言

由於C程序的函數調用是采用傳值調用,即實際參數與形式參數相結合時,實參將值傳給形式參數,所以當我們利用函數來處理數組時,如果需要對數組在子程序中修改,只能傳遞數組的地址,進行傳地址的調用,在內存相同的地址區間進行數據的修改。

在實際的應用中,如果需要利用子程序對數組進行處理,函數的調用利用指向數組(一維或多維)的指針作參數,無論是實參還是形參共有下面四種情況:

我們知道,二維數組在內存中是按行存放,假定我們定義二維數組和指針如下:
int a[3][4],* p = a [ 0 ] ;
則指針p就指向二維數組。其在內存的存放情況如圖6 - 11所示。

從上述存放情況來看,若把二維數組的首地址傳遞給指針p,則映射過程如圖6 - 11
所示。我們只要找到用p所表示的一維數組中最大的元素及下標,就可轉換為在二維數組中的
行列數。
# include<stdio.h>
m a i n ( )
{
int a[3][4],*ptr,i,j,max,maxi,maxj;
/ * m a x 是數組的最大, m a x i 是最大元素所在行, m a x j 是最大元素所在列* /
f o r ( i = 0 ; i < 3 ; i + + )
f o r ( j = 0 ; j < 4 ; j + + )
s c a n f ( " % d " , & a [ i ] [ j ] ) ;
p t r = a [ 0 ] ; / * 將二維數組的首地址傳遞給指針變量* /
m a x _ a r r ( p t r , & m a x , & m a x i , 1 2 ) ;
m a x j = m a x i % 4 ; / * 每行有四個元素,求該元素所在列* /
m a x i = m a x i / 4 ; / * 求該元素所在行* /
printf("max=%d,maxi=%d,maxj=%d",max,maxi,maxj);
}
int max_arr(b,p1,p2,n)
int *b,*p1,*p2,n;
/ * b 指向二維數組的指針, p 1指向最大值,p 2 指向最大值在一維數組中的位置, * /
/ * n 是數組的大小* /
{
int i;
*p1=b[0]; *p1=0;
f o r ( i = 1 ; i < n ; i + + ) / * 找最大* /
if (b[i]>*p1) {*p1=b[i]; *p2=i;}
}
運行程序:

6.4.4 指針與字符數組
在前面的課程中,我們用過了字符數組,即通過數組名來表示字符串,數組名就是數組的首地址,是字符串的起始地址。下面的例子用於簡單字符串的輸入和輸出。
#include<stdio.h>
main()
{
char str[20];
gets(str);
printf("%s\n",str);
}

現在,我們將字符數組的名賦予一個指向字符類型的指針變量,讓字符類型指針指向字
符串在內存的首地址,對字符串的表示就可以用指針實現。其定義的方法為:charstr[20],
*P=str;這樣一來,字符串str就可以用指針變量P來表示了。
#include<stdio.h>
main()
{
char str[20],*p=str;/*p=str則表示將字符數組的首地址傳遞給指針變量p*/
gets(str);
printf("%s\n",p);
}
RUN
good morning!
goodmorning!
需要說明的是,字符數組與字符串是有區別的,字符串是字符數組的一種特殊形式,存儲時以“\0”結束,所以,存放字符串的字符數組其長度應比字符串大1。對於存放字符的字符數組,若未加“\0”結束標志,只能按逐個字符輸入輸出。
[例6-18]字符數組的正確使用方法。
#include<stdio.h>
main()
{
charstr[10],*p=str;
int i;
scanf("%s",str);/*輸入的字符串長度超過10*/
for(i=0;i<10;i++)
printf("%c",*p++);/*正確輸出*/
printf("\n");
p=str;
printf("%s",p);/*字符數組無'\0'標志,輸出出錯*/
puts(str);/*字符數組無'\0'標志,輸出出錯*/
}
對上述程序中字符數組以字符串形式輸出,若無“\0”標志,則找不到結束標志,輸出出
錯。
[例6-19]用指向字符串的指針變量處理兩個字符串的復制。
字符串的復制要注意的是:若將串1復制到串2,一定要保證串2的長度大於或等於串1。
#include<stdio.h>
main()
{
char str1[30],str2[20],*ptr1=str1,*ptr2=str2;
printf("inputstr1:");
gets(str1);/*輸入str1*/
printf("inputstr2:");
gets(str2);/*輸入str2*/
printf("str1------------str2\n");
printf("%s.......%s\n",ptr1,ptr2);
while(*ptr2)*ptr1++=*ptr2++;/*字符串復制*/
*ptr1='\0';/*寫入串的結束標志*/
printf("str1------------str2\n");
printf("%s.......%s\n",str1,str2);
}
在程序的說明部分,定義的字符指針指向字符串。語句while(*ptr2)*ptr1++=*ptr2++;先測試表達式的值,若指針指向的字符是“\0”,該字符的ASCII碼值為0,表達式的值為假,循環結束,表達式的值非零,則執行循環*ptr1++=*ptr2++。語句*ptr1++按照運算優先級別,先算*ptr1,再算ptr1++。

現在,我們修改程序中語句printf("%s.......%s\n",str1,str2)為printf("%s.......%s\n",ptr1,ptr2);
會出現什麼結果呢?請思考。
[例6-20]用指向字符串的指針變量處理兩個字符串的合並。
#include<stdio.h>
main()
{
char str1[50],str2[20],*ptr1=str1,*ptr2=str2;
printf("inputstr1:");
gets(str1);
printf("inputstr2:");
gets(str2);
printf("str1------------str2\n");
printf("%s.......%s\n",ptr1,ptr2);
while(*ptr1)ptr1++;/*移動指針到串尾*/
while(*ptr2)*ptr1++=*ptr2++;串/*連接*/
*ptr1='\0';/*寫入串的結束標志*/
ptr1=str1;ptr2=str2;
printf("str1------------------str2\n");
printf("%s.......%s\n",ptr1,ptr2);
}

需要注意的是,串復制時,串1的長度應大於等於串2;串連接時,串1的長度應大於等於串1與串2的長度之和。

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