2012-01-27 41 views
11

Đây là giao dịch. Tôi có một mảng ký tự lớn và đang cố gắng điều khiển nó. Dưới đây là một số mã tôi đã sử dụng để thử nghiệm ý tưởng:Rắc rối với con trỏ 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); 
} 

gì nó là nghĩa vụ phải làm là:

  1. Đặt phần tử đầu tiên đến 8
  2. Sau đó, trong khi các yếu tố hiện tại không phải là zero,
    1. di chuyển đến các tế bào tiếp theo
    2. Thêm 5 đến nó
    3. Move lại
    4. 012.
    5. Trừ một. (Điều này lặp đi lặp lại 8 lần vì các thử nghiệm trong khi sẽ thất bại khi nó đã trừ người cuối cùng)
  3. hiển thị vị trí của con trỏ
  4. hiển thị các nội dung của mảng con trỏ trỏ đến (Tôi hy vọng)

Những gì nó:

1 Φ 

như trái ngược với

40 ( 

^^ 8 x 5 = 40, vì vậy đó là nội dung hiển thị.

Bất kỳ mẹo/đề xuất/phê bình nào được chấp nhận.

+0

bạn gần như đã có nó nhưng khi bạn xác định một con trỏ với * e bạn không cần phải tham khảo nó như * e chỉ e và cung cấp cho bạn địa chỉ bộ nhớ của con trỏ. Khi bạn * e nó một lần nữa như với * e + = 8 bạn đang dereferencing nó và thêm 8 vào giá trị ASCII char đó là có làm cho nó một số char khác. – L7ColWinters

+3

Lưu ý rằng 'main' phải trả về' int' (thường là 0). –

+0

Bạn cũng nên khởi tạo mảng của mình. Không đảm bảo rằng * e là 8 sau '* e + = 8;' – user606723

Trả lời

10

Bạn đang dereferencing chính xác nơi bạn nên không và ngược lại. Những gì bạn có nghĩa là để làm là:

*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 

* lấy giá trị các điểm con trỏ đến.

+3

Không phải "chính xác". Điều kiện điều khiển của 'while' là chính xác. –

7

"Đặt phần tử đầu tiên đến 8" sẽ là

*e = 8; 

"Di chuyển tới ô tiếp theo" sẽ là

e += 1; 

và vân vân.

Với e bạn đang truy cập vào con trỏ, địa chỉ. Tăng/giảm dần nó sẽ di chuyển con trỏ ra và quay trở lại.

Với *e bạn truy cập vào giá trị mà nó trỏ đến (dereference it).

Bạn đang sử dụng nó theo cách khác trong hầu hết các lần.

Ghi chú: Lưu ý rằng trong khai báo e bạn phải viết char *e = r; để khởi tạo con trỏ (không phải giá trị). Tại đây, * chỉ định loại e. Tuyên bố ghi: e là một con trỏ đến char và giá trị của nó là (địa chỉ) e --- nó tương tự như char *r; r = e;.

+0

Vì vậy, '* e' thay vì' e'? Tôi thực sự bối rối. Phần * có tham chiếu đến giá trị hoặc vị trí không? EDIT: Nó hoạt động, tôi chuyển ra tất cả '* e' với 'e' s và ngược lại. Cảm ơn! – itdoesntwork

+3

'e' là vị trí. '* e' là giá trị. – asaelr

6

*edereferences con trỏ; nghĩa là, nó thao túng giá trị được trỏ tới. Thao tác với con trỏ chính nó có nghĩa là thao tác trực tiếp e.

Khi bạn làm e+=5, bạn đang di chuyển con trỏ lên phía trước 5 khoảng trắng, nếu bạn làm *e+=5, thì bạn thêm 5 vào giá trị được trỏ tới bởi con trỏ.

2

Bạn hiểu sai số học con trỏ và dereference.

*e được sử dụng để truy cập vào những gì e điểm đến, vì vậy *e += 1 tăng giá trị của những gì e điểm đến, không đi đến địa chỉ sau. Ngoài ra, e += 8 tăng con trỏ thực tế và e giờ sẽ trỏ tại mục nhập thứ chín trong mảng.

2

Bạn đang gây nhầm lẫn với dereferencing của mình. Toán tử * khi gọi con trỏ cung cấp cho bạn dữ liệu được lưu trữ tại vị trí đó. Nếu không có nó sẽ cho bạn địa chỉ.

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

giải pháp có thể:

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

Bạn chỉ cần trộn * và &.

Nếu P là con trỏ, thì * P là giá trị được trỏ bởi con trỏ. Nếu V là giá trị, thì & V là địa chỉ nơi giá trị được lưu trữ.

Các vấn đề liên quan