Tôi đã cố gắng để hiểu điều gì đó với con trỏ, vì vậy tôi đã viết mã này:con trỏ In ấn trong C
#include <stdio.h>
int main(void)
{
char s[] = "asd";
char **p = &s;
printf("The value of s is: %p\n", s);
printf("The direction of s is: %p\n", &s);
printf("The value of p is: %p\n", p);
printf("The direction of p is: %p\n", &p);
printf("The direction of s[0] is: %p\n", &s[0]);
printf("The direction of s[1] is: %p\n", &s[1]);
printf("The direction of s[2] is: %p\n", &s[2]);
return 0;
}
Khi biên dịch nó với gcc tôi nhận được những cảnh báo này:
$ gcc main.c -o main-bin -ansi -pedantic -Wall -lm
main.c: In function ‘main’:
main.c:6: warning: initialization from incompatible pointer type
main.c:9: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char (*)[4]’
main.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char **’
main.c:12: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char ***’
(Cờ cho gcc là vì tôi phải là C89)
Tại sao các loại con trỏ không tương thích? Không phải là tên của một mảng một con trỏ đến phần tử đầu tiên của nó? Vì vậy, nếu s là con trỏ đến 'a', &s
phải là char **
, không? Và tại sao tôi nhận được các cảnh báo khác? Tôi có phải đúc các con trỏ với (void *
) để in chúng không?
Và khi chạy tôi nhận được một cái gì đó như thế này:
$ ./main-bin
The value of s is: 0xbfb7c860
The direction of s is: 0xbfb7c860
The value of p is: 0xbfb7c860
The direction of p is: 0xbfb7c85c
The direction of s[0] is: 0xbfb7c860
The direction of s[1] is: 0xbfb7c861
The direction of s[2] is: 0xbfb7c862
thế nào có thể giá trị của s và nó hướng (và tất nhiên giá trị của p
) có giống nhau không?
Cảm ơn bạn rất nhiều James ... – alcuadrado
một mảng cũng có nghĩa là địa chỉ bộ nhớ tiếp giáp của loại cụ thể vì 's' phân rã thành con trỏ, chúng ta có thể nói đó là con trỏ tới' char * '[phần tử đầu tiên của mảng] –
@ CholthiPaulTtiopic - Không. Trước hết, đó là "chúng ta có thể nói đó là một con trỏ tới' char' "(không phải' char * '). NHƯNG, bạn có thể sử dụng nó như một con trỏ để 'char' trong một số trường hợp, nhưng điều đó không làm cho nó một. "5.0" có thể là một số nguyên, nhưng nó không phải là một 'int', mặc dù bạn có thể sử dụng nó ở một số nơi có một' int'. –