2

私は最近 C の学習を始めたばかりです。配列とポインターの概念を理解していたときに、それを理解する上でつまずきのブロックに遭遇しました。

このコードを検討してください -

#include<stdio.h>

int main()

 {

 char string[]="Hello";
 char *ptr;

 ptr=string;

 puts(*ptr);

 return(0);

 }

コンパイルされますが、実行時にセグメンテーション違反が発生します。

私が得る警告は次のとおりです。

puts の引数 1 に型エラーがあります。'char' が見つかりました 'char へのポインタ' が必要です

*ptr は文字 "H" を返しますが、私の最初の印象は、入力として char を受け入れるだけだというものでした。

後で、 puts() は入力として文字配列へのポインターを期待していることを理解するようになりましたが、私の質問は、このようなものを渡すときです- puts("H"), puts(* と同じことではありませんか? ptr)、*ptr に文字 "H" が含まれている場合。

4

6 に答える 6

3

"H"'H'2バイトとで構成される文字列リテラルです'\0'。コードに「H」が含まれている場合は常に、2バイトのメモリ領域へのポインタを意味します。*ptr単に単一のchar変数を返します。

于 2012-10-05T16:00:01.580 に答える
2

を実行することによりputs(*str)、変数を逆参照しstrます。次に、これは「H」文字をメモリアドレスとして使用しようとし(それがstr)を指すため、無効なポインタになるため(プロセスのメモリ外になる可能性があるため)、segfaultを実行します。これは、puts関数が引数としてポインターを受け入れるためです。

あなたが本当に欲しいのはですputs(str)

余談ですが、後者の例puts("h")では、コンパイル時に文字列テーブルに「h」を入力し、そこでの定義を暗黙のポインタに置き換えます。

于 2012-10-05T15:59:37.387 に答える
2

puts()関数は文字列へのポインタを取り、あなたがしているのは単一の文字を指定することです。

このレッスン9:C文字列をご覧ください。

だからやるよりも

#include<stdio.h>

int main()

 {

 char string[]="Hello";
 char *ptr;

 ptr=string;    // store address of first character of the char array into char pointer variable ptr
                // ptr=string is same as ptr=&string[0] since string is an array and an
                // array variable name is treated like a constant pointer to the first
                // element of the array in C.
 puts(*ptr);    // get character pointed to by pointer ptr and pass to function puts
                // *ptr is the same as ptr[0] or string[0] since ptr = &string[0].
 return(0);

 }

代わりにやるべきです

#include<stdio.h>

int main()

 {

 char string[]="Hello";
 char *ptr;

 ptr=string;  // store address of first character of the char array into char pointer variable ptr

 puts(ptr);  // pass pointer to the string rather than first character of string.

 return(0);

 }
于 2012-10-05T16:00:18.097 に答える
1

get に文字列を入力したり、put を使用して表示したいときはいつでも、ポインターまたは文字列の位置を実際に渡す必要がありました。

例えば

char name[] = "Something";

それを印刷したい場合

あなたは書く必要がありますprintf("%s",name); --> name actually stores the address of the string "something"

表示したい場合はプットを使用して

puts(name) ----> same as here address is put in the arguments
于 2012-10-05T17:39:44.067 に答える
0

いいえ。

「H」は文字リテラルです。

「H」は、事実上、「H」と終了する「\0」ヌルバイトの2つの要素を持つ文字配列です。

于 2012-10-05T15:59:18.630 に答える
0

putsは文字列ポインタの入力として待機しているため、メモリアドレスを待機しています。しかし、あなたの例では、メモリの内容を提供しました*ptr。これ*ptrは、アドレスを持つメモリの内容ptrです。h

ptrはメモリアドレスです

*ptrこの記憶の内容です

putsの入力パラメーターはアドレスタイプですが、charタイプ(アドレスの内容)を指定しました

puts入力として指定したアドレスから文字ごとに印刷を開始し、そこに含まれるメモリまで印刷0を停止します。

于 2012-10-05T16:03:43.510 に答える