2011-11-05 33 views
26

tôi đã nhầm lẫn với việc sử dụng của %c%s trong chương trình C sauStrings và nhân vật với printf

#include<stdio.h> 

    void main() 
    { 
    char name[]="siva"; 
    printf("%s\n",name); 
    printf("%c\n",*name); 
    } 

Output là

siva 
s 

Tại sao chúng ta cần phải sử dụng con trỏ để hiển thị một nhân vật% c và con trỏ không cần thiết cho một chuỗi

Tôi gặp lỗi khi sử dụng

printf("%c\n", name); 

Lỗi tôi đã nhận là

str.c: In function ‘main’: 
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ 

Trả lời

42

Nếu bạn cố gắng này:

#include<stdio.h> 

void main() 
{ 
char name[]="siva"; 
printf("name = %p\n", name); 
printf("&name[0] = %p\n", &name[0]); 
printf("name printed as %%s is %s\n",name); 
printf("*name = %c\n",*name); 
printf("name[0] = %c\n", name[0]); 
} 

Output là:

name = 0xbff5391b 
&name[0] = 0xbff5391b 
name printed as %s is siva 
*name = s 
name[0] = s 

Vì vậy, 'name' thực sự là một con trỏ đến mảng ký tự trong bộ nhớ.Nếu bạn cố gắng đọc bốn byte đầu tiên tại 0xbff5391b, bạn sẽ thấy 's', 'i', 'v' và 'a'

Location  Data 
========= ====== 

0xbff5391b 0x73 's' ---> name[0] 
0xbff5391c 0x69 'i' ---> name[1] 
0xbff5391d 0x76 'v' ---> name[2] 
0xbff5391e 0x61 'a' ---> name[3] 
0xbff5391f 0x00 '\0' ---> This is the NULL termination of the string 

Để in một nhân vật bạn cần phải vượt qua giá trị của nhân vật để printf. Giá trị có thể được tham chiếu dưới dạng tên [0] hoặc * tên (vì tên mảng = & tên [0]).

Để in chuỗi, bạn cần chuyển con trỏ tới chuỗi để printf (trong trường hợp này là 'name' hoặc '& name [0]').

4

Tên của một mảng là địa chỉ của phần tử đầu tiên của nó, vì vậy name một con trỏ tới bộ nhớ chứa chuỗi "Siva".

Ngoài ra, bạn không cần con trỏ để hiển thị ký tự; bạn chỉ cần chọn sử dụng nó trực tiếp từ mảng trong trường hợp này. Bạn có thể thực hiện việc này thay thế:

char c = *name; 
printf("%c\n", c); 
+1

Thêm vào điểm '* name' là * derefencing * con trỏ (tức là trở về điều mà con trỏ trỏ đến) –

6

Bạn đang nhầm lẫn với toán tử dereference * với chú thích loại con trỏ *. Về cơ bản, trong C * có nghĩa là những thứ khác nhau ở những nơi khác nhau:

  • Trong một loại, * có nghĩa là một con trỏ. int là một kiểu số nguyên, int * là một con trỏ tới số nguyên
  • Là một toán tử tiền tố, * có nghĩa là 'dereference'. tên là một con trỏ, * tên là kết quả của việc dereferencing nó (tức là nhận được giá trị mà con trỏ trỏ đến)
  • Tất nhiên, như một toán tử infix, * có nghĩa là 'nhân'.
+0

'*' trong tham chiếu đến một con trỏ, luôn luôn có nghĩa là cùng một điều. bạn chỉ là overthinking nó (một dấu hiệu của trí thông minh). nhìn vào nó như thế này, 'int * myintptr;' có nghĩa là địa chỉ con trỏ 'myintptr' đang tham chiếu sẽ lưu trữ một' int', và '* myintptr = 5;' có nghĩa là địa chỉ con trỏ 'myintptr' đang tham chiếu nên chứa một 5. '*' luôn có nghĩa là "giá trị tại". –

8
%c 

được thiết kế cho một nhân vật duy nhất một char, vì vậy nó chỉ in một element.Passing mảng char như một con trỏ bạn đang đi qua các địa chỉ của phần tử đầu tiên của mảng (có nghĩa là một char duy nhất) và sau đó sẽ được in:

s

printf("%c\n",*name++); 

sẽ in

i

và vân vân ...

Pointer là không cần thiết cho% s vì nó có thể làm việc trực tiếp với String của các nhân vật.

0

Nếu bạn muốn hiển thị một ký tự đơn lẻ, bạn cũng có thể sử dụng name[0] thay vì sử dụng con trỏ.

Nó sẽ phục vụ mục đích của bạn, nhưng nếu bạn muốn hiển thị chuỗi đầy đủ bằng %c, bạn có thể thử này:

#include<stdio.h> 
void main() 
{ 
    char name[]="siva"; 
    int i; 
    for(i=0;i<4;i++) 
    { 
     printf("%c",*(name+i)); 
    } 
} 
Các vấn đề liên quan