久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2721|回復: 0
打印 上一主題 下一主題
收起左側

字符串指針作函數參數

[復制鏈接]
跳轉到指定樓層
樓主
ID:83710 發表于 2015-6-24 19:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
將一個字符串從一個函數傳遞到另一個函數,可以使用傳地址的方式,即用字符數組名或字符指針變量作參數。有以下四種情況:
實參形參
1數組名數組名
2數組名字符指針變量
3字符指針變量字符指針變量
4字符指針變量數組名
[例] 用函數調用實現字符串的復制。
(1)用字符數組作參數。
voidcopy_string(char from[], char to[])
{int i=0;
while(from != '\0')
{ to = from; i++; }
to = '\0';
}
main()
{char a[] = "I am a teacher.";
char b[] = "you are a student.";
printf("string_a =%s\n string_b =%s\n", a,b);
copy_string(a,b);
printf("string_a =%s\n string_b =%s\n", a,b);
}
main()函數可以改寫為(使用字符指針):
main()
{char *a = "I am a teacher.";
char *b = "you are a student.";
printf("string_a =%s\n string_b =%s\n", a,b);
copy_string(a,b);
printf("string_a =%s\n string_b =%s\n", a,b);
}
(2)形參用字符指針。
void(char *from, char *to)
{
for(; *form != '\0'; from++, to++)
   *to = *from;
*to = '\0';
}
main()
{char *a = "I am a teacher.";
char *b = "you are a student.";
printf("string_a =%s\n string_b =%s\n", a,b);
copy_string(a,b);
printf("string_a =%s\n string_b =%s\n", a,b);
}
(3)對copy_string函數的幾種簡化
void copy_string(char *from, char *to)
{
while((*to=*from) !='\0')
   {to++; from++}
}

*to=*from是一個賦值表達式,其值等于*from。to++和from++分別使指針指向下一個字節。
先執行賦值表達式,再判賦值表達式的值(等于*from)是否為'\0',因此,from串中的結尾字符'\0'被賦值給to。
voidcopy_string(char *from, char *to)
{
while((*to++=*from++) != '\0');
}

*to++=*from++先執行*to=*from,再使to、from分別加1。
voidcopy_string(char *from, char *to)
{
while(*from != '\0')
*to++ = *from++;
*to = '\0';
}
當遇到*from='\0'時,不執行賦值運算*to++=*from++,因此,最后應加一句*to='\0'。
voidcopy_string(char *from, char *to)
{
while(*to++=*from++);
}

與第②種簡化相同,當*from='\0'時,表達式*to++=*from++的值等于'\0'(假),結束while循環。
voidcopy_string(char *from, char *to)
{
for(;(*to++ =*from++) !=0;);
for(;*to++ =*from++;);
}
⑤ for循環的結束條件是表達式*to++ =*from++的值(即*from的值)等于'\0'。且form中的'\0'已被賦給to。注意'\0'的ASCII碼是不是0。
voidcopy_string(char from[], char to[])
{char *p1, *p2;
p1 = from; p2 = to;
while((*p2++=p1++) !='\0')
}

形參用數組,使用局部指針變量指向形參數組。


(4).字符串指針作函數的參數
字符串指針作函數的參數,與前面介紹的數組指針作函數參數沒有本質的區別,函數間傳遞的都是地址值,所不同的僅是指針指向對象的類型不同而已。
例5 用字符串指針作函數參數,將輸入的一個字符串復制到另一個字符串中(重點例題)。
#include "stdio.h"
main()
{
void copy_s(char *,char *);   
char a[20],b[30];
gets(a);                  
copy_s(a,b);               
puts(b);                  
}
void copy_s(char *str1,char *str2)
{
while((*str2=*str1)!='\0')
    {
     str1++;
     str2++;
    }
}
程序在主函數中定義了兩個字符數組a和b,a數組由gets()函數獲得,b數組通過調用copy_s()函數自動生成。copy_s()函數有兩個指向字符串的形參,其功能是將str1指向的字符串復制到str2中。
copy_s()函數體由一個while語句構成,其條件表達式“(*str2=* str 1)!='\0'”的計算過程是:先進行賦值*str2=*str1,將指針str1的內容送到指針str2指向的存儲位置,然后再判斷所賦值的字符是否是串結束標記'\0'。若條件表達式成立,即當前復制的字符不是串結束標記,則繼續循環,復制下一個字符;否則,退出循環,完成串復制。
在主函數中調用copy_s()函數時,必須注意兩個實參地址的順序,第一個實參是原始字符串首地址,第二個實參是目標字符串首地址。本程序調用時使用的是存儲兩個字符串的字符數組名。當然,在函數調用時,也可以直接使用字符串指針變量作函數實參,如下是修改后的main()函數:
main()
{
void copy_s(char *,char *);
char a[20],b[30],*pa=a,*pb=b;
gets(pa);      
copy_s(pa,pb);              
puts(pb);                  
}
事實上,這種使用字符串的方法在C語言程序中更為常用。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 自拍偷拍3p | 成人免费网视频 | 国产精品99视频 | 拍真实国产伦偷精品 | 激情五月婷婷综合 | 99久久国产免费 | 精品久久影院 | 国产一区二区精品自拍 | 一区二区三区福利视频 | 激情一区二区三区 | 女生羞羞视频 | 欧美激情在线播放 | 999视频| 精品伊人久久 | 欧美片网站免费 | 精品亚洲一区二区 | av性色| 精品美女| 欧美亚洲国产一区二区三区 | 99久久精品免费看国产免费软件 | 免费在线观看一区二区 | 精品国产欧美 | 中文精品视频 | 亚洲精品不卡 | 精品不卡| 国产激情视频网址 | 精品欧美一区二区在线观看视频 | 欧美一区二区三区久久精品 | 国产精品久久av | 亚洲永久精品国产 | 亚洲一区二区三区在线视频 | 三级视频久久 | 国产精品av久久久久久毛片 | 高清不卡毛片 | 久久久久久成人 | 波多野结衣一二三区 | 久久精品免费一区二区三 | 国产激情毛片 | 欧美一区二区在线观看 | 一区观看 | 久久国产精品久久久久 |