C言叶のあれらの小さい秘密の【针(3)】

5747 ワード

FROM: http://blog.csdn.net/bigloomy/article/details/6612650
======================================================
しかし、凡人はみな急功近利で惰性があり、私は例です.どのブログにも要約と大きな文字の説明を書きたくありませんが、新しい読者の友达に私のブログの内容を理解してもらうために、私は前に言ったように、最初のポインタに関する要約を引っ越してきました.私が書いたこれらの文章はすべてポインタについているので、すべての要約を書く必要はありません.ここでこっそり怠けています.私の前の2つのCポインタブログを読んだことがある友达は、このブログの前の要約をスキップして読まずに、直接テーマの部分に入ることができます.
C言語を知っている人は、C言語が強いのは、自由性のほとんどが柔軟なポインタの運用に現れていることを知っています.だから、ポインタはc言語の魂であり、少しも過言ではない.だから私のタイトルに(一)を加えてもポインタの重要性がわかります.できるだけポインタに対する理解を皆さんに説明します.だから说明の过程の中で私はできるだけコードで文字の说明の方式をプラスして、コードの分析を通じて私达の指针に対する理解を深めて、私はすべて完全なコードを与えて、だから読者は见る过程の中で直接copyを下りて実行することができて、以下の说明があなたに役に立つことを望みます.
C言語では2つの方法で1つの文字列にアクセスできます.
1、文字配列で文字列を保存する
char str[ ]="this is str!!!";
ここstrは、文字列配列のヘッダアドレスを表す配列名です.
2、文字ポインタで文字列を指す
char *str="this is str,too";
C言語は文字列定数を文字配列で処理し,メモリに文字配列を開いて文字列定数を格納する.ここでstrは、1つのポインタ変数として定義され、1つの文字変数と他の文字データのみを指す文字型配列を指す.出力はprintf("%s",str)を使用します.この過程でシステムはまずstrが指す文字データを出力し、strプラス1の方法で次の文字を出力し、'0'列の終端文字に遭遇するまで、メモリ内の文字列の最後に自動的に'0'が加算されることを知っています.
文字列の伝達は、文字配列の名前または文字配列を指すポインタ変数をパラメータとしてアドレスする方法を使用することができる.呼び出された関数では文字列の内容を変更することができ,主関数では変更された文字列を得ることができる.
一、文字配列をパラメータとする
次のコードを見てみましょう.
#include <stdio.h>
void copy_string(char from[],char to[])
{
 int i=0;
 while(from[i]!='\0'){
  (to[i]=from[i]);
  i++;
 }
 
 to[i]='\0';
 
 return ;
}
int main()
{
 char str[]="this is a string!";
 printf("%s
",str); char dec_str[206]; copy_string(str,dec_str); printf("%s
",dec_str); return 0; }

実行結果:
C语言的那些小秘密之【指针(三)】
コード実装の難易度だけでは難点はありませんが、私たちのコードの赤いマークのコード部分を忘れてエラーになる人も少なくないかもしれません.
ここでは、私の別の実装方法も示します.
#include
void copy_string(char from[],char to[]) {  int i=0;  while((to[i]=from[i++])!='\0'){   ;  }    return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
実行結果:
C语言的那些小秘密之【指针(三)】
注目すべきは,この実装方式におけるwhile文while((to[i]=from[i+])!='0').決してwhile((to[i++]=from[i+])!='と書かないでください.0')では,実行判断文ごとにi++が2回実行され,最終的な結果エラーが発生する.
二、文字ポインタによる変数
 
#include
void copy_string(char *from,char *to) {  int i=0;  while(*from!='\0')   *to++=*from++;   *to='\0';     return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
実行結果:
C语言的那些小秘密之【指针(三)】
カンマ式とforループ文を組み合わせた参照コードも提供します.
#include
void copy_string(char *from,char *to) {  int i=0;  for(;*to=*from,*from!='\0';from++,to++);     return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
 
実行結果:
C语言的那些小秘密之【指针(三)】
コードの巧みな点は、カンマ式とforループ文を組み合わせて実現されることです.カンマ式の結果は最後の式の結果であるため、判断文の中のカンマ式を実行するときに取られる値は*from!='0'.
興味のある読者は自分で他の実現方法を試してみることができ、以下にいくつかの巧みな実現方法を提供し、興味のある読者は自分でその実現原理を研究することができ、すべて完全なコードである.
#include
void copy_string(char *from,char *to) {  int i=0;  for(;*to++=*from++;);     return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
 
#include
void copy_string(char *from,char *to) {  int i=0;  while(*to++=*from++);     return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
 
#include
void copy_string(char *from,char *to) {  int i=0;  while((*to++=*from++)!='\0');     return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
 
#include
void copy_string(char *from,char *to) {  char*p1,*p2;  p1=from;  p2=to;  while((*p2++=*p1++)!='\0');     return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
 
#include
void copy_string(char from[],char to[]) {  char*p1,*p2;  p1=from;  p2=to;  while((*p2++=*p1++)!='\0');     return ; }
int main() {  char str[]="this is a string!";  printf("%s",str);  char dec_str[206];  copy_string(str,dec_str);  printf("%s",dec_str);  return 0; }
ここで一つ一つ実行結果を貼るのではなく、実行結果と同じように、興味があれば以上のコードを自分で研究することができ、同時に多くの実現方法があり、以上のコードが読者のインスピレーションを啓発してより多くの実現方法とより良い実現案を書くことを望んでいる.
======================================================