私は K&R を読んでいて、ポインターに関する章をほぼ読み終えました。それらを正しい方法で使用しようとしているかどうかは完全にはわかりません。ポインターを使用して itoa(n) を実装してみることにしました。私が行った方法に明らかに間違っていることはありますか?何かを行うために文字列バッファーとして機能する大きな配列を取っておく必要があることは特に好きではありませんが、それが実際にCで正しい方法であるかどうかはわかりません.
コードでポインターを使用することを決定する際に従うべき一般的なガイドラインはありますか? 以下のコードで改善できる点はありますか? 静的文字列バッファーなしで文字列を操作する方法はありますか?
/*Source file: String Functions*/
#include <stdio.h>
static char stringBuffer[500];
static char *strPtr = stringBuffer;
/* Algorithm: n % 10^(n+1) / 10^(n) */
char *intToString(int n){
int p = 1;
int i = 0;
while(n/p != 0)
p*=10, i++;
for(;p != 1; p/=10)
*(strPtr++) = ((n % p)/(p/10)) + '0';
*strPtr++ = '\0';
return strPtr - i - 1;
}
int main(){
char *s[3] = {intToString(123), intToString(456), intToString(78910)};
printf("%s\n",s[2]);
int x = stringToInteger(s[2]);
printf("%d\n", x);
return 0;
}
最後に、誰かが配列とポインタの違いを明確にしてくれますか? K&R には、私が非常に混乱しているセクションがあります。「5.5 - 文字ポインターと関数。」ここに引用します:
「定義には重要な違いがあります。
char amessage[] = "now is the time"; /*an array*/ char *pmessage = "now is the time"; /*a pointer*/
amessage は配列で、一連の文字とそれを初期化する '\0' を保持するのに十分な大きさです。配列内の個々の文字は変更される場合がありますが、メッセージは常に同じストレージを参照します。一方、pmessage はポインターであり、文字列定数を指すように初期化されます。その後、ポインターは別の場所を指すように変更される可能性がありますが、文字列の内容を変更しようとした場合の結果は未定義です。」
それは一体何の意味ですか?