電子書籍の厳選無料作品が豊富!

c言語の文字列とポインタについて。

①ポインタとして宣言した場合は、キーボードからの入力に使用できない。

②配列として宣言した場合は、初期化以外で文字列を代入することは出来ないが、
ポインタとして宣言した場合は、他の文字列を指すという形で代入することが出来る。

この二点について、あまり理解できません。教えてください。
宜しくお願い致します。

A 回答 (3件)

いずれも、正確ではありません。



ポインタは、矢印に例えてもよいでしょう。
char *p ;
とすることで
p →
という矢印が用意されます。
で、その先がどこを指しているか、わかりません。
「NULLを指している」といったことも決まっていません。

char buf[256], c ;
p = buf ; /* p→ buf[0] */
p = &c ; /* p→ c */
p = malloc(256); /* p→ mallocで確保した領域 */
等と、意味のあるものと結びつけることによって、はじめて「ポインタpを通してその先にあるものにアクセスする」ということができるようになります。

> ①ポインタとして宣言した場合は、キーボードからの入力に使用できない。

宣言したあと、入力先に対応した領域と結びつけてあれば、入力できます。
結び付けられていないポインタから、「その先」を使おうとしたらうまく動作しないのは、キーボードからの入力だけではありません。



C言語では「文字列なんて無い」という考えが必要です。
「文字列」だと思っているものは「charの配列」です。
"abc" と「文字列」に見えるものは、
char str_abc[]={'a','b','c',0} ;
と、どこかに書いてあって、このchar配列 abc を使うことと同じです。

char *p ;
char buf[256] ;

p="abc" ; /* p = str_abc と同じで、 配列の先頭へのポインタとして解釈されるからできる */
buf="abc" ; /* buf = str_abc と同じで、配列に配列は代入できない */

> 配列として宣言した場合は、初期化以外で文字列を代入することは出来ない

初期化は、= を使っていますが、代入ではありません。
あくまで「初期化」です。
配列全体に代入できないのは、どんな場合でもできません。
char buf[] ="abc" ;
は代入しているわけではありません。
char buf[]={'a','b','c',0} ;
の別記法となっています。
    • good
    • 1

#1のかたが言っている「そんなことはない」の実例です。


---------------------------------------------
#include<stdio.h>
#include<string.h>
int main(){
int a;
int b;
int *p;
char str1[10] = "xyz"; //②配列として宣言した場合で初期化で文字列を代入すること
char str2[10];
char str3[10];
p = &b;
printf("a=>");
scanf("%d",&a); //①ポインタとして宣言した場合は、キーボードからの入力に使用できない。
printf("b=>");
scanf("%d",p); //①でポインターでキーボードからの入力を受け取る方法
printf("a=%d b=%d\n",a,b); //結果の確認
printf("a=%d b=%d\n",a,*p); //結果の確認

strcpy(str2,"opq"); //②配列として宣言した場合で初期化以外で文字列を代入すること
str3[0] = 'A'; //②配列として宣言した場合で初期化以外で文字列を代入すること
str3[1] = 'B'; //同上
str3[2] = 'C'; //同上
str3[3] = '\0'; //同上
printf("str1=%s\n",str1); //結果の確認
printf("str2=%s\n",str2); //結果の確認
printf("str3=%s\n",str3); //結果の確認
return 0;
}
----------------------------------
以下、実行結果です。
a=>3
b=>5
a=3 b=5
a=3 b=5
str1=xyz
str2=opq
str3=ABC
    • good
    • 1

2点とも、そんなことはないとしか言いようがないですけど

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!