2012-01-27 180 views
11

這是交易。我有一個大字符數組,並試圖操縱它。下面是一些代碼,我使用來測試這個想法:C指針故障

#include <stdio.h> 

char r[65536],*e=r; 

main() { 
    e+=8; 
    while(*e) { 
     *e+=1; 
     e+=5; 
     *e-=1; 
     e-=1; 
    } 
    *e+=1; 
    printf("%i",*e); 
    printf(" %c",e); 
} 

什麼它應該做的是:

  1. 設置爲8
  2. 的第一個元素之後,而目前的元素不爲零,
    1. 移動到下一個單元格
    2. 添加5〜它
    3. 回遷
    4. 減去一個。 (此重複8次,因爲同時測試將失敗時,它已經減去最後一個)
  3. 顯示指針
  4. 顯示陣列,該指針指向(希望)的內容的位置

作用:

1 Φ 

,而不是

40 ( 

^^ 8 x 5 = 40,這就是它應該顯示的內容。

任何提示/建議/批評接受。

+0

你幾乎可以得到它,但是當你用* e定義一個指針時,你不需要把它稱爲* e只是e,並且給你指針的內存地址。當你再次像* e + = 8一樣時,你正在解引用它,並在ASCII值char中加上8,這使得它有一些其他的字符。 – L7ColWinters 2012-01-27 14:01:10

+3

請注意,'main'應該返回一個'int'(通常爲0)。 – 2012-01-27 14:38:23

+0

你也應該初始化你的數組。在* e + = 8之後不能保證* e是8;' – user606723 2012-01-27 17:31:04

回答

10

你提領究竟,你應該,反之亦然。你的意思做的是:

*e+=8; 
while(*e) { 
    e+=1; 
    *e+=5; 
    e-=1; 
    *e-=1; 
} 
*e+=1; 
printf("%d",e - r); //index 
printf(" %p",e); //pointer value  
printf(" %c",*e); //pointee value 

*檢索值的指針指向。

+3

不是「完全」。 'while'的控制條件是正確的。 – 2012-01-27 14:31:37

7

「的第一個元素設置爲8」 將是

*e = 8; 

「移動到下一個小區」 將是

e += 1; 

等。

With e您正在訪問指針,地址。遞增/遞減它會使指針前後移動。

With *e您可以訪問它指向的值(取消引用它)。

您在大多數時間都是以相反的方式使用它。

備註:請注意,在e聲明你必須寫char *e = r;初始化指針(不是值)。這裏*指定e的類型。聲明如下:e是指向char,其值爲(的地址)e ---它與char *r; r = e;類似。

+0

那麼,'* e'而不是'e'?我很困惑。 *部分是指價值或位置?編輯:它的工作原理,我用'e's把所有'*'換掉,反之亦然。謝謝! – itdoesntwork 2012-01-27 14:02:58

+3

'e'是位置。 '* e'是價值。 – asaelr 2012-01-27 14:04:42

6

*edereferences指針;也就是說,它操縱指向的值。操縱指針本身意味着直接操作e

當你做e+=5時,如果你做的是*e+=5,那麼你將指針向前移動5個空格,然後給指針指向的值加5。

2

您誤解了指針算術和解引用。

*e用於訪問哪些e點,所以*e += 1增加什麼e點的價值,而不是進入到下一個地址。另外,e += 8增加了實際指針,並且e現在將指向數組中的第九個條目。

2

你混淆了你的取消引用。調用指針時,運算符會給出存儲在該位置的數據。沒有它給你的地址。

0
#include <stdio.h> 

char r[65536], *e=r; 

int main() 
{ 
    *e = 8; 
    while (*e) { 
     e++; 
     *e += 5; 
     e--; 
     *e -= 1; 
    } 
    e++; 
    printf("%p %c\n", e, *e); 
    return 0; 
} 
1

可能的解決辦法:

#include <stdio.h> 

char r[65536]; 
char* e = r; 

main() { 
    *e = 8; 
    while(*e) { 
     e++; 
     *e+=5; 
     e--; 
     *e-=1; 
    } 
    e++; 
    printf("position : %i\n",e-r); 
    printf("value : %c\n",*e); 
} 

您只需混合*和&。

如果P是一個指針,那麼* P是指針指向的值。 如果V是一個值,則& V是存儲值的地址。