2015-02-23 64 views
-4
#include"stdio.h" 
void print2(int ***b) { 
printf("\n %d \n",***b); 
***b=14; 
printf("\n %d \n",***b); } 
void print(int ***b) { 
printf("\n %d \n",***b); 
***b=11; 
printf("\n %d \n",***b); } 
void print1(int **b) { 
printf("\n %d \n",**b); 
**b=12; 
printf("\n %d \n",**b); } 

int main() { 
int p =10; int *q = &p; int **r = &q; int ***a = &r; 
printf("\n %d \n",***a); 
print(a); //i.e print(&*a); 
printf("\n %d \n",***a); 
print1(*a); //i.e print1(&**a); 
printf("\n %d \n",***a); 
print2(**a); //i.e print2(&***a); 
printf("\n %d \n",***a); 

return 0; } 
 
tptr.c:32:8: warning: incompatible pointer types passing 
     'int *' to parameter of type 'int ***' 
     [-Wincompatible-pointer-types] 
print2(**a); //i.e print1(&***a); 1000 
     ^~~ 
tptr.c:2:20: note: passing argument to parameter 'b' here 
void print2(int ***b) 
+5

我沒有看到任何程序! – Rizier123 2015-02-23 17:50:44

+1

什麼是不清楚的錯誤信息? – 2015-02-23 17:53:00

+0

什麼是'a'?什麼是'print2'?他們的聲明是什麼? – 2015-02-23 17:53:10

回答

0

我覺得你對星星在一個聲明和表達式中意味着不同的東西感到困惑。

當你聲明

int *q = &p; 

int *型或指針的變量q爲整數。功能參數的聲明也是一樣。具有原型的功能

void f(int *q); 

將參數int *或指針指向int。

當您使用聲明的變量時,您只需將該變量引用爲q,而不使用星號。所以,如果你想通過你的指針到整數q的功能f,這需要一個指向整數,只是說

f(q); 

這裏,q是指針本身。如果您想獲得指向的值,則必須使用解引用運算符取消引用q

聲明語法背後的基本原理是「聲明模仿使用」,而指針的(主要)使用是通過解引用來獲取其內容。 (這與使用方括號中的維數來聲明數組有些類似,當通過查找帶有方括號中的索引的值來使用它時)。

地址 - 運算符(一元運算符&)的做法相反:變量的地址,以便您可以將其存儲在指針中。你的(有些人爲的)例子是這樣做的;數值p,*q,**r***a都指的是p的值。

舉例來說,我已經簡化你的榜樣位:

#include <stdio.h> 

void print0(int n) 
{ 
    printf("%d\n", n); 
} 

void print1(int *p) 
{ 
    printf("%d\n", *p); 
} 

void print2(int **p) 
{ 
    printf("%d\n", **p); 
} 

void print3(int ***p) 
{ 
    printf("%d\n", ***p); 
} 

int main() 
{ 
    int p = 10; 
    int *q = &p; 
    int **r = &q; 
    int ***a = &r; 

    print0(p);  print1(&p); 
    print0(*q);  print1(q);  print2(&q); 
    print0(**r); print1(*r);  print2(r);  print3(&r); 
    print0(***a); print1(**a); print2(*a);  print3(a); 

    return 0; 
} 

見,因爲他們使用的print功能如何聲明它們的參數以同樣的方式。並且具有間接水平的變量被傳遞給printx,即沒有任何明星並且沒有操作員的地址。 (你不能直接獲取變量的地址,因爲地址只是一個數字,而不是一個地址本身的變量,當然,如果它被保存的話,你可以間接獲取地址在一個變量中,如你的例子。)

+0

感謝您與程序的美妙解釋:) – ypp 2015-02-24 06:36:26

相關問題