1

char配列へのポインターを関数に渡す方法を確認するために、小さなテストプログラムを作成しました。これは私のコードです:

#include <stdio.h>
#include <string.h>

int scopy(char *org ){
    printf("the value of org is %s" , org);
    printf("\n");
}

int main(void)
{
    char original[11];
    strcpy(original , "helloworld");

    scopy(original);

    printf("the value of original now is %s" , original);

    return 0;
}

ポインターに関する私の知識は、 org が original[0] のメモリ アドレスを渡されるポインターであることを示しています。 .

org を印刷すると、完全な単語が返されます。しかし、論理によれば、ポインターがメモリアドレスを出力するはずではありません。

out[1] 、 out[2] を印刷しようとすると、コードパッドはプロセスが異常終了したことを通知します

この質問に対する私の基本的な疑問は、 org が正確に何をしているのかということです。メモリアドレスを指す char ポインターであることを理解しています (これ??) 。助けていただければ幸いです。私はcプログラミングに非常に慣れていません。

また、次のようなwhileループを試すと

while(out[i] !='\0')
printf("%s",out[i]);

'\0' で終了しません。strcpy のドキュメントには、'\0' が char 配列にコピーされると記載されています。

4

2 に答える 2

3

orgは、scopyで渡すものであるcharへのポインター(配列の最初の要素へのポインター)です。%sprintfで指定子を使用する場合、charへのポインターを文字列として扱います。その値をポインタとして出力したい場合は、%p代わりに使用する必要があります。例えば:printf("The memory address in org is %p\n", org);

%sあなたの言うことから、数字を文字列に変換すると思うような気がします。それはそれをしません、それは文字列の最初の文字へのポインタを期待します。

配列の名前はと同等であることに注意して&array[0]ください。つまり、関数で配列の名前を渡すときは、最初の要素へのポインターを渡します。したがって、ここで呼び出すscopy(original)と、を書くのと同じになりますscopy(&original[0])。また、original[0]はacharであり、&はそれへのポインタであるため、関数は。を取りますchar *

于 2013-03-04T22:59:15.383 に答える
0

はい、その通りです。を呼び出すとscopy(original);、scopyはoriginal配列内の1.要素へのポインタを渡します。

scopy(original);とまったく同じですscopy(&original[0]);

ただし、printfでは%sを使用します。%sは、一致する引数がcharポインターであり、charのシーケンスにポインティングすることを想定しており、そのシーケンスの終わりは0バイトです。それがCが文字列と呼んでいるものです。

つまり、たとえばprintf("%s",org[i]);、org [i]はcharであるため、0バイトで終わる配列へのcharポインタではありません。

prinf["%c", org[0])`while(out [i]!='\ 0')を実行すると、単一の文字を出力できます。

または、whileループの場合:

while(out[i] !='\0')
  printf("%c",out[i]);

そして、あなたも試すことができます:

while(out[i] !='\0')
  printf("%s",&out[i]);
于 2013-03-04T23:00:14.903 に答える