2012-01-21 74 views
1

這個問題讓我瘋狂,我敢肯定我錯過了一些東西。我只需要使用指針來初始化一個字符數組。下面是我到目前爲止的代碼:使用指針初始化字符數組

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(可能是一個數組)的指針。有*字符串==>字符串[0],*(字符串+ 1)=字符串[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 

而且有雙向如何解決您的字符串:

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++p + 1,C增加內存地址。 *p運算符告訴編譯器,您現在想要使用存儲器中存儲的數據,而不是使用指針。爲此這兩個語法都相同:

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

認爲你的意思是這樣的:

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

在這種情況下,你會解決字符s[x]

0

首先,你並不需要一個char **除非你需要一個數組的數組。

其次,你可以獲取到數組的結尾與(*s)[10]*((*s)+10)

第三,在C編程,不投malloc()

0

代碼分崩離析這裏的結果。

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

你11個char s,這聽起來像你想要做什麼分配足夠的存儲空間。

但是,你鑄造地址的11 char s到一個(char**)因爲如果你是爲指針,不char小號分配空間。

+0

是的,我需要爲指向字符(字符數組,字符串)的10個指針分配空間。然後,我需要遍歷數組,並通過指針指定值。我將如何解決我在** s中創建的指針? – certifiedNoob

+0

@certifiedNoob:一個字符數組/字符串不需要10個指針。一個人會完成這項工作。這就是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數組。如果您開始使用指針,堆棧和堆的設計可能會非常有用。