2012-01-27 13 views
11

İşte anlaşma. Büyük bir karakter dizilim var ve onu manipüle etmeye çalışıyorum. bunu yapmak gerekiyordu neC işaretçiliğindeki sorun

#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); 
} 

geçerli:: İşte bazı kod ben fikri test etmek kullanıyordum var şimdiki eleman sıfır değilken

  1. , Sonra 8
  2. ilk öğenin hazırlanması,
  3. kendisine 5 ekleyin geri
  4. Taşı
  5. sonraki hücreye
    1. Taşı
    2. Birini çıkar.
  6. Ekran pointer
  7. Ekran için işaretçi noktaları (umarım) bu dizinin içeriğini yeri (ederken testi bu sonuncusu çıkarılır zaman başarısız olur, çünkü bu 8 defa tekrarlar)

İşlevi:

1 Φ 

40 ( 
aksine

^^ 8 x 5 = 40, yani göstermesi gereken bu.

Herhangi bir ipucu/öneri/eleştiri kabul edildi.

+0

Neredeysebitirmeyi var ama bir işaretçi tanımlarken * Eğer * e sadece e kadar buna bakmaya ihtiyacım yok e ve bu da seni ibrenin bellek adresini verir. * E + = 8 ile tekrar ederseniz, bunu başka bir karaktere dönüştüren ASCII değerindeki kareye 8 ekleyerek 8 karakterini eklediğinizde. – L7ColWinters

+3

'main' ın' int' (normalde 0) döndürmesi gerektiğini unutmayın. –

+0

Dizininizi de başlatmalısınız. * E'nin 8'den sonra * e + = 8; – user606723

cevap

10
Sen tam dereferencing ediyoruz

nereye gerektiği değil ve tersi de geçerlidir. Ne yapmak geliyordu:

*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 

* değeri için işaretçi noktaları alır.

+3

"Tam olarak" değil. 'While'in kontrol koşulu doğrudur. –

7

*e = 8; 

olmak böyle devam

e += 1; 

ve olurdu "sonraki hücreye taşı" olur "8 ilk öğenin hazırlanması".

e ile işaretçiye, adrese erişiyorsunuz. Arttırma/azaltma, işaretçiyi ileri ve geri hareket ettirir.

*e ile işaret ettiği değere erişirsiniz (uygunluk).

Bunu çoğu zaman başka bir şekilde kullanıyorsunuz.

Açıklama: e beyanında Eğer işaretçi (değil değer) başlatmak için char *e = r; yazmak zorunda olduğunu unutmayın. Burada *, e türünü belirtir. Bildiride: e, char işaretçisidir ve değeri (adresi) e --- bu, char *r; r = e;'a benzer.

+0

Yani, "e" yerine "e"? Gerçekten kafam karıştı. * Kısmı değer mi, yoksa yer mi? DÜZENLEME: Çalışır, ben her şeyi e * ile değiştirdim ve tersi. Teşekkürler! – itdoesntwork

+3

'e' konumdur. '' e' değeridir. – asaelr

6

*edereferences işaretçi; Yani, işaret edilen değeri işler. İşaretçiyi işlemek, doğrudan e'un manipüle edilmesi anlamına gelir.

e+=5'u yaptığınızda, *e+=5 yaparsanız işaretçiyi 5 boşlukla ilerletirsiniz, ardından işaretçi tarafından işaret edilen değere 5 ekleyin.

2

Sen işaretçi aritmetik ve dereference yanlış anlamaktadır.

*e

yüzden *e += 1 sonraki adrese gider ne e işaret ettiği değeri değil artırır ne e puan erişmek için kullanılır. Ayrıca, e += 8 gerçek işaretçi artar ve e artık dizi dokuzuncu girişinde işaret edecektir.

2

Sen referanslanması karıştırıyorsun. İşaretçiyi çağırırken * işleci, size konumdaki verileri verir. Onsuz size adresi verir.

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

Olası çözüm:

#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); 
} 

Sadece * karıştırılır ve &.

P işaretçiyse, * işaretçiyi işaret eden değerdir. V bir değer ise , o zaman & V değeri depolanır adresidir.