2015-12-09 25 views
1

正如c書中所寫的,數組名稱是指向第一個元素的指針,所以在名稱數組中,名稱指向的第一個元素也是指向字符串的指針,然後*名稱將打印第一個元素,但在代碼p的下一行指向a,並且q指向q,如名稱arr,但是作爲u打印* qu沒有得到3的值,爲什麼?數組和指針鏈

#include <stdio.h> 
int main(void){ 
    char *names[]={"jack","philip"}; 
    printf("%s\n",*names); 
    int a=3; 
    int *p=&a; 
    int *q=&p; 
    printf("%i\n",*q); 
    return 0; 
} 
+0

對不起,在第3行的問題第二個q是p不q,錯過鍵入 –

+1

它應該是int ** q,&p是一個int指針的地址,以獲得您的上一個打印3,做** q –

+0

如果你像@RyanFitzpatrick取消,'q'等同於'&p','* q'等同於'&a'。 '** q'等價於存儲'3'的'a'。 – ViniciusArruda

回答

1

aint,所以p是一個指向intint *),從而q是一個指向的指針intint **)。要打印int,你給那個intprintf

printf("This is an int: %i\n", 42); 

所以對於%i功能printf預計int類型的參數,但是你通過*q給它,這是int *類型。你傳遞一個指向printf的指針,它不會指望數字的指針,只能指向字符串。

1

區別在於printf()%s需要一個指向空終止字符串的指針,而%i期望被交給數字本身,而不是指向數字的指針,這就是你所擁有的。

0

這是工作的代碼應該是什麼樣子

#include <stdio.h> 

int main(void) { 
    char *names[]={"jack","philip"}; 
    printf("%s\n",*names); 
    int a=3; 
    int *p=&a; 
    int **q=&p; 
    printf("%i\n",**q); 
    return 0; 
} 

%s需要一個char *正如你正確地指出是*名稱是什麼,因爲名稱是char類型的**。不過%i期望int。由於p指向a,p是一個int指針,因爲q指向p q是一個指向int指針的指針。 q只是無論p指向(的地址),所以它不會打印你想要的。還指定int類型爲int *的地址(這是什麼youre做,當你做INT * Q = & P)會有意想不到的效果

printf("%i", *q); 

會像做

printf("%c", *names); 

這顯然會給出奇怪的輸出