2012-01-21 4 views
1

この問題は私を夢中にさせている、私は何かが欠けていると確信している。私はポインターだけを使用してcharの配列を初期化する必要があります。以下は、私がこれまで持っているコードです:ポインタを使って文字の配列を初期化する

int p2(){ 
     /* Implements problem 2 of lab */ 

     // Create an array 
     char **s = (char**)malloc(11 *sizeof(char)); 
     char *p = *s; 
     char start ='A'; 

     while(p != s+10){ 
      *p = start; 
      start++; 
      p++; 
     } 

     return(0); 
    } 

私がいる問題は、私は、配列の中の文字に対処する方法がわからないです。配列のベースアドレスが** sで、最初の要素へのポインタが* sであることを理解しています。私が理解していないのは、** s + 10(つまり配列の最後)に到達する方法です。

誰かが私のためにいくつかの光を照らすことができますか?お願いします!

編集:私は質問を誤解しているようです。私は文字列の配列を作成する必要があるようです(したがって、char **の割り当て)。次に、この配列をループし、各文字列(つまりchar *)に15文字分の値を代入する必要があります。

char ** strings ==> strings [0 ... n]ここで、各要素はchar(場合によっては配列)へのポインタであることを私に教えてください。 * string ==> strings [0]、*(string + 1)= strings [1]など

私は閉鎖されていますか?

答えて

4

char **sは、2次元の文字配列または必要に応じてC文字列の配列です。あなたは文字の配列を使用したい場合は あなたが使用する必要があります。

char *string = (char*)malloc(11 *sizeof(char)); 

あなたは本当にあなたがポインタの配列を初期化している最初のステップでは、文字列の配列を初期化したい場合は、それはです:

char **s = (char**)malloc(11 *sizeof(char *)); 

sizeofの内側にchar *を使用しています。文字列を使用する場合よりも、最初は各文字列を初期化する必要があります。

s[0] = (char*) malloc(15*size(char)); // This is actually string, 14 characters long (NULL terminated) 
char *p = s[0]; // p is pointer to beginning of your string now 

そして、あなたの文字列対処する方法を2つの方法があります:

s[0][3] // 4th character of your string 
p[3] 

か、使用したい場合は、単にポインタ:

char *p = *(s+0); 
*(p+3); // 4th character 
*((*(s+0))+3) // To do it "hardcore" 

編集:例を追加しました

**char pがあり、を使用しているときまたはp + 1の場合、Cはメモリアドレスを増加させます。 *pオペレータは、ポインタではなく、メモリに格納されたデータを扱うことをコンパイラに指示します。そのため、これらの2つの構文は、同じ操作を行います。あなたは、両方のあなたの次元を横断したい場合

p[10] = 'a'; 
*(p+10) = 'a'; 

だから、あなたが使用する必要があります。

for(int i = 0; i < 11; i++){ 
    char *p = *(s+i); 
    for(int j = 0; j < 10; j++){ 
     *(p + j) = 'a'; // Say you wanna fill them with as 
    } 

    // You may also use this syntax: 
    while(p < (*(s+i) + 10)){ // or use != instead of < 
     *p = 'a'; 
     p++; 
    } 
} 
+0

配列(** s?)をどのようにトラバースしますか?それはでしょうか pCurr = * s; while(pCurr!= *(s + 10)){... pCurr ++} – certifiedNoob

+0

@certifiedNoobトラバースの例を追加しました。 – Vyktor

2

私はあなたがこの意味考える:あなたはs[x]

0

まず付き文字に対処したいあなたは、配列の配列を必要としない限り、あなたはchar **を必要としない場合には

 char *s = (char*) malloc(11 *sizeof(char)); 
    char *p = s; 

を。

第二に、あなたは(*s)[10]または*((*s)+10)

第三に、配列の最後に取得することができ、Cプログラミングでは、コードが離れてここに落下さmalloc()

0

の結果をキャストしないでください。

char **s = (char**)malloc(11 *sizeof(char)); 

あなたが何をしたいかのように聞こえる11のcharのための十分なメモリを、割り当てています。

ただし、charではなく、ポインタのためのスペースを割り当てているかのように、11 charから(char**)にアドレスをキャストしています。

+0

はい、文字(文字配列、別名ストリング)に10個のポインターのスペースを割り当てる必要があります。次に、配列をループしてポインタに値を代入する必要があります。私は** sで作成したポインタにどのように対処しますか? – certifiedNoob

+0

@certifiedNoob:文字配列/文字列には10個のポインタは必要ありません。 1人は仕事をします。それがmallocが返すものです。配列の先頭へのポインタ。 –

1

なぜあなたは文字の配列を作成するための二重のポインタを使用する必要がありますか?

char *s = (char *) malloc(10 * sizeof(char)); 
char *start = s; // save starting pointer 

for(; s < start+10; s++) 
    *s = 'a'; 

return 0; 

char **を割り当てると、本質的にcharへのポインタの配列(文字列の配列など)が割り当てられます。 char配列が必要な場合は、char配列を割り当てます。ポインタを使って作業を開始すると、スタックとヒープの設計が本当に役に立ちます。

関連する問題