0

私が取り組んでいる現在のプロジェクトで誰かが私を助けてくれれば、この概念をよりよく理解できると思います。C を使用して、ポインタを使用して特定のメモリ アドレスのデータを編集したいと考えています。具体的には、特定の場所からデータを読み取り、特定の場所に書き込む必要がある 2 つの文字配列 (文字列) があります。

*and->やなどのポインターの構文については、ほとんど混乱しています&

私の理解で*は、ポインタの現在のメモリアドレスに保持されているデータを指します。したがって、たとえば、 a の先頭メモリ アドレスにあるデータを編集したい場合は、次のchar *pようにします。 (*p) = 'c';

では、先頭から2 番目のメモリ アドレスの文字を変更したい場合はどうすればよいpでしょうか。

&また、ポインターの位置を指すことも理解しています。しかし、この構文の使い方がわかりません。

これが私の例です:

   int orig_length = strlen(original_string); //-1 for \0?
char *poriginal, *pnew_string;

poriginal = &original_string; 

while(orig_length>0) {
 k = 0;
 j = 0;
 while(isalpha(*(poriginal+j))) { 
   j++;
   k++;
 }
 while(k > 0) {
   *(pnew_string+(j-k)) = toupper(*(poriginal+k-1)); //toupper
   k--;
 }
 if(*(poriginal+(j)) == '_') { 
   *(pnew_string+(j)) = ' '; 
 }
 else {
   *(pnew_string+(j)) = *(poriginal+(j)); 
 }
 orig_length = orig_length - j;
}
*(pnew_string+strlen(pnew_string)) = '\0'; //Syn? Is this actually necessary? 
... //program continues...

ちなみに、このプログラムは「now_i_understand!」という文字列を 1 つ受け取ることを意図しています。各単語を反転し、各単語を大文字にし、_ を ' ' に切り替え、他の句読点はそのままにしておきます: "WON I DNATSREDNU!"

4

2 に答える 2

3

扱っているのが文字の配列である場合 (実際にそうです)、配列構文を使用します。

pnew_string[j+1] = poriginal[j+1];

この構文は次と同等であることに注意してください。

*(pnew_string + j + 1) = *(poriginal + j + 1);

しかし、より読みやすいです。

この例を考えると、他のほとんどのケースに対処することは明らかです。

于 2013-02-09T02:43:02.880 に答える
1

*と演算子は&互いに逆です。ポインタオブジェクトは、メモリ内の他のオブジェクトのアドレスを保持します(または、オブジェクトを指さない古いnullポインタ)。

単項*演算子はポインタオペランドを取り、それが指すオブジェクトを提供します。これは間接参照と呼ばれます。

単項&演算子は、任意の型のオブジェクトを参照するオペランドを取り、そのオブジェクトへのポインターを提供します。演算子&アドレスです。

例えば:

int obj = 42; /* obj is an object of type int; it currently holds the value 42 */
int *ptr;     /* ptr is a pointer to an int */
ptr = &obj;   /* ptr now holds the address of obj */
printf("obj = %d\n", obj); /* prints 42 */
printf("*ptr = %d\n", *ptr); /* also prints 42; *ptr is another name for obj */

->演算子は、ポインターを逆参照し、ポインターが指すメンバーにアクセスするための省略形です。プレフィックスは、構造体または共用体へのポインタである必要があります。foo->barはと同じことを意味します(*foo).bar。ここfooで、はポインタであり、はを指すbarメンバーの名前ですfoo

ポインタに対して算術演算を実行することもできます。ptrが配列の要素を指すポインタである場合、は配列ptr + 1の次の要素を指し、その後の要素を指すptr + 2、というように続きます。

配列の[]索引付け演算子は、実際にはポインター演算の観点から定義されています。ptr[2]とまったく同じことを意味し*(ptr+2)ます。これを、ほとんどのコンテキストで配列名が配列の最初の要素へのポインターに減衰するという事実と組み合わせると、少し考えればarr[2]、配列の3番目の要素arr(インデックス付けはで始まるため3番目)を参照する方法がわかります0

comp.lang.c FAQのセクション4(ポインター)とセクション6(配列とポインター)を強くお勧めします。それはおそらく私が持っているよりもこのことをよりよく説明するでしょう。

于 2013-02-09T03:01:46.123 に答える