2014-06-09 16 views
5

Tôi đang cố gắng tìm hiểu con trỏ trong C, và đã đi qua các khái niệm. Tôi đi qua câu hỏi trong phòng thí nghiệm này, và cố gắng viết một giải pháp cho nó.Con trỏ trỏ đến một điểm ký tự trong C là gì?

/* p1.c 
Write a short C program that declares and initializes (to any value you like) a 
double, an int, and a char. Next declare and initialize a pointer to each of 
the three variables. Your program should then print the address of, and value 
stored in, and the memory size (in bytes) of each of the six variables. 
Use the “0x%x” formatting specifier to print addresses in hexadecimal. You 
should see addresses that look something like this: "0xbfe55918". The initial 
characters "0x" tell you that hexadecimal notation is being used; the remainder 
of the digits give the address itself. 
Use the sizeof operator to determine the memory size allocated for each 
variable. 
*/ 

Tuy nhiên, tôi có hai loại chính của các lỗi khi tôi biên soạn theo chương trình

  1. định dạng placeholders của tôi cho báo cáo kết quả printf dường như là tất cả các sai. Tôi đã ấn tượng rằng địa chỉ bộ nhớ có thể được in bằng% x hoặc% p. Nhưng trong chương trình của tôi, cả hai cảnh báo trình biên dịch được tạo ra. Tôi không hiểu - tại sao trong một số chương trình trước đây của tôi,% p làm việc mà không có bất kỳ cảnh báo nào và tại sao cả% x và% p không hoạt động ở đây. Ai đó có thể vui lòng giúp tôi về việc trình giữ chỗ nào hoạt động với loại dữ liệu nào?

  2. Vấn đề chính khác là gán một con trỏ cho một biến ký tự. Khi tôi chạy chương trình này, tôi nhận được lỗi phân đoạn trong tuyên bố printf thứ ba của chương trình. Tôi không chắc chắn lý do tại sao nó là Somali

Nếu tôi đúng, một tuyên bố như this-

char array[]="Hello World!" 

char *ptr=array

đặt con trỏ biến nhân vật ptr để trỏ đến phần tử đầu tiên của biến mảng array. Vì vậy, lý tưởng, *ptr sẽ cho biết 'H', *(ptr+1) sẽ cho biết 'e' v.v.

Theo cùng một logic, nếu tôi có một biến ký tự var3 với char 'A', thì làm cách nào để tạo biến con trỏ ptr3 trỏ đến nó?

Dưới đây là chương trình tôi wrote-

#include<stdio.h> 

int main() 
{ 
int var1=10; 
double var2=3.1; 
char var3='A'; 

int *ptr1=&var1; 
double *ptr2=&var2; 
char *ptr3=&var3; 

printf("\n Address of integer variable var1: %x\t, value stored in it is:%d\n", &var1, var1); 
printf("\n Address of double variable var2: %x\t, value stored in it is:%f\n", &var2, var2); 
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3); 

printf("\n Address of pointer variable ptr1: %x\t, value stored in it is:%d\n", ptr1, *ptr1); 
printf("\n Address of pointer variable ptr2: %x\t, value stored in it is:%f\n", ptr2, *ptr2); 
printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3); 

printf("\n Memory allocated for variable var1 is: %i bytes\n", sizeof(var1)); 
printf("\n Memory allocated for variable var2 is: %i bytes\n", sizeof(var2)); 
printf("\n Memory allocated for variable var3 is: %i bytes\n", sizeof(var3)); 

printf("\n Memory allocated for pointer variable ptr1 is: %i bytes\n", (void *)(sizeof(ptr1))); 

return 0; 
} 

Bất kỳ trợ giúp sẽ được nhiều nhiều đánh giá cao. Cảm ơn bạn.

+0

'% c' là dành cho ký tự. '% s' là dành cho các chuỗi được kết thúc bằng null. Bạn có một char. – user2357112

+1

"Con trỏ trỏ đến điểm ký tự trong C là gì?" *Một nhân vật***. –

+0

Tại sao bạn đúc 'sizeof (ptr1)' thành 'void *'? – user2357112

Trả lời

6

Bạn có tất cả chính xác ngoại trừ việc chỉ định printf cho char%c (không phải %s).

Tiếp theo cùng một logic, nếu tôi có một biến nhân vật var3 với char 'A', sau đó như thế nào nên tôi thực hiện một con trỏ biến ptr3 điểm đến nó?

Xem mã của bạn để tìm câu trả lời!

Hoewver bạn ave một số loại không khớp trong các báo cáo printf khác. Trong tài khoản cuối cùng bạn sử dụng %i cho (void *), tôi không chắc bạn đang nghĩ gì ở đó.

Để in kết quả của sizeof sử dụng %zu (và không truyền tới void *), điều này áp dụng cho bốn báo cáo printf cuối cùng của bạn.

Trong các tuyên bố khác bạn sử dụng %x để in địa chỉ. Điều này là sai (khóa học của bạn là sai để tư vấn cho điều này cũng).Bạn nên sử dụng %p để in địa chỉ.

Về mặt kỹ thuật, bạn cũng nên truyền địa chỉ đến void *, mặc dù trên tất cả các hệ thống hiện đại, tất cả các con trỏ đều có cùng kích thước và biểu diễn để bạn không phải làm việc đó.

+0

Cảm ơn bạn đã cung cấp thông tin này, nó thực sự hữu ích. Tôi thực sự ngạc nhiên khi không có tài liệu nào mà tôi gặp phải cho đến nay đã khuyên bạn nên sử dụng '% zu' để in kết quả của toán tử' sizeof'. Điều này đã sửa chữa giải pháp của tôi, cùng với '% c'. Chỉ một điều - tôi không bao giờ hiểu tại sao việc đúc thành 'void *' là cần thiết cho con trỏ, bạn có thể xin tư vấn về điều này không? –

+1

Lệnh '% p' specifier hy vọng một' (void *) ', nếu bạn cho nó cái gì khác sau đó nó cố gắng để đọc bộ nhớ, nếu như bạn đã cho một 'void *'. Nếu điều bạn cho nó thực sự đi lại và nói như một 'void *' thì nó hoạt động, nếu không nó sẽ không thành công. –

+3

'% zu' đã được bổ sung vào năm 1999, một số tài liệu tham khảo đã không bắt kịp mà đến nay chưa (và một số trình biên dịch * coughMSVCcough * mất một thời gian dài để bắt kịp) –

0

Là nhiệm vụ của bạn bắt buộc phải dùng 0x%x specifier \ định dạng sau đó chuỗi đầu tiên in nên được như thế, ví dụ: printf("\n Address of integer variable var1: 0x%x\t, value stored in it is:%d\n", (unsigned int)&var1, var1); Tiếp theo, tôi tin rằng bạn sẽ hiểu theo cùng một cách.

1
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3); 

printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3); 

Đâycủa bạn vấn đề. Hãy nhìn vào printf và nó cãi nhau, precisly:

% s,% s được sử dụng để in chuỗi.

Chuỗi là gì?

Chuỗi được xác định bởi 0 ký tự cộng với ký tự '\ 0'.

Sự cố ở đây là gì?

Var3tuyên bố như char, vì vậy không một chuỗi .

Printf sẽ làm gì? Hãy nhìn vào bộ nhớ của bạn:

(aa125121) (địa chỉ ngẫu nhiên bộ nhớ) aa aa aa

  • Bold là nhân vật của bạn
  • aa aa aa là một bộ nhớ chương trình khác

printf cố gắng để đọc tại 65 và thành công (in)

printf cố gắng để đọc một số '\ 0' hoặc giá trị vật BAMMM Phân khúc lỗi khác

của bạn truy cập chương trình vào địa chỉ bộ nhớ sai .

Soluce:

sử dụng% c

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