C言語における文字列付与処理方式
C言語では、文字列を文字ポインタ変数に付与したり、文字列を文字配列で保存したりすることができます.c言語は文字列に直接文法糖のサポートを提供していないからである.また、C標準ライブラリでは、文字列を空の文字の末尾で処理する方法が多いので、これは覚えておく必要があります.
答:二重引用符は3つのことをしました:1.スペース(定数領域)を申請し、文字列2を格納.文字列の末尾に'/0'3を付ける.リターンアドレス
ここで返されるアドレスはpに割り当てられます
二、
char *p = “hello”;式はどうしてできるのか、pを配列に変えてから値をつけるのはだめです.
説明:
文字列定数helloが式に表示されると、「hello」式では、文字自体ではなく、これらの文字が格納されているアドレス(定数領域)が使用されます.
したがって、文字列を文字を指すポインタpに割り当てることができ、文字列を文字配列に割り当てることはできない.
char a[10] = “hello”;//これにより、c言語の初期化がサポートされる
char aと書けば[10]
そしてa=「hello」はこれで間違いです.
同様にa配列、char a[10]=「hello」である.これは配列の初期化であり,a[0]=‘h’a[1]=‘e’...と同じ理屈である.
でもchar aに変えて[10]
そしてa=「hello」ではだめです「hello」の値は1つのアドレスですが、aにもアドレスがありますが、これはポインタとは異なり、ポインタの値はアドレスで、配列の値もアドレスですが、定数なので定数に値を割り当てることはできません.
コードテスト
このようなエラーメッセージを見て、char a[10]をchar a[6]に変更したいと思いますか?
試してみると、
error C2106: ‘=’ : left operand must be l-value
演算子の左側には「左値」があるはずです.「左値」とは、プログラムにメモリ領域を占有し、様々な変数などの変更可能な量を指す.
ポインタを使用する場合、ポインタは自己増加できますが、配列名は自己増加できません.
コンパイラは配列に空間を割り当て、配列aのアドレスは定数を表し、定数を増やしてはいけないに違いない.
拡張を続ける:ポインタが自増すると、コンパイラは自動的にタイプを認識します.例えば、ポインタはint型を指しています.次のアドレスを取得したい場合は、ポインタは直接p++でいいです.これ以上p+4をしないでください.特に注意しなければならないのは、voidポインタが使用されている場合は、ポインタ演算は使用できません.void型コンパイラはタイプの長さ(ポインタが指すオブジェクトの体積)を認識できないため、p++は数学演算もできないし、*取値操作もできないので、使用するには他のタイプに変換しなければならない.
char *p,a='5';
p=&a; // ,
p="abcd"; // ??
答:二重引用符は3つのことをしました:1.スペース(定数領域)を申請し、文字列2を格納.文字列の末尾に'/0'3を付ける.リターンアドレス
ここで返されるアドレスはpに割り当てられます
二、
char *p = “hello”;式はどうしてできるのか、pを配列に変えてから値をつけるのはだめです.
説明:
文字列定数helloが式に表示されると、「hello」式では、文字自体ではなく、これらの文字が格納されているアドレス(定数領域)が使用されます.
したがって、文字列を文字を指すポインタpに割り当てることができ、文字列を文字配列に割り当てることはできない.
char a[10] = “hello”;//これにより、c言語の初期化がサポートされる
char aと書けば[10]
そしてa=「hello」はこれで間違いです.
同様にa配列、char a[10]=「hello」である.これは配列の初期化であり,a[0]=‘h’a[1]=‘e’...と同じ理屈である.
でもchar aに変えて[10]
そしてa=「hello」ではだめです「hello」の値は1つのアドレスですが、aにもアドレスがありますが、これはポインタとは異なり、ポインタの値はアドレスで、配列の値もアドレスですが、定数なので定数に値を割り当てることはできません.
コードテスト
#include
int main()
{
char *p = "hello";
printf("%s",p);
char a[10];
a = "hello";
return 0;
}
error C2440: '=' : cannot convert from 'char [6]' to 'char [10]'
There is no context in which this conversion is possible
このようなエラーメッセージを見て、char a[10]をchar a[6]に変更したいと思いますか?
試してみると、
error C2106: ‘=’ : left operand must be l-value
演算子の左側には「左値」があるはずです.「左値」とは、プログラムにメモリ領域を占有し、様々な変数などの変更可能な量を指す.
ポインタを使用する場合、ポインタは自己増加できますが、配列名は自己増加できません.
コンパイラは配列に空間を割り当て、配列aのアドレスは定数を表し、定数を増やしてはいけないに違いない.
拡張を続ける:ポインタが自増すると、コンパイラは自動的にタイプを認識します.例えば、ポインタはint型を指しています.次のアドレスを取得したい場合は、ポインタは直接p++でいいです.これ以上p+4をしないでください.特に注意しなければならないのは、voidポインタが使用されている場合は、ポインタ演算は使用できません.void型コンパイラはタイプの長さ(ポインタが指すオブジェクトの体積)を認識できないため、p++は数学演算もできないし、*取値操作もできないので、使用するには他のタイプに変換しなければならない.