为什么我的程序无效?

时间:2015-02-23 17:50:21

标签: c

#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)

1 个答案:

答案 0 :(得分:0)

我认为你对于明星在宣言和表达中意味着不同的东西感到困惑。

宣布

int *q = &p;

您获得类型为q的变量int *或指向整数的指针。声明函数参数也是如此。原型

的函数
void f(int *q);

采用int *参数或指向int。

的指针

当您使用声明的变量时,您只需将变量称为q,而不使用星号。所以如果你想把你的指针传递给整数q到函数f,它需要一个指向整数的指针,那么就说

f(q);

这里,q是指针本身。如果您想获得指向的值,则必须使用解除引用运算符取消引用q,即明星:*q

声明语法背后的基本原理是"声明模仿使用",并且(主要)使用指针是通过解除引用来获取其内容。 (当你通过在方括号中查找带有索引的值来使用它时,它有点类似于在方括号中声明维数的数组。)

address-of运算符(一元&)正好相反:它采用变量的地址,以便您可以将其存储在指针中。你的(有点人为的)例子是这样做的;值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函数如何以与使用它们相同的方式声明其参数。具有x间接级别的变量将传递给printx未加修饰,即没有任何星号且没有地址操作符。

(你不能直接获取变量的地址不止一次,因为地址只是一个数字,而不是一个带有地址本身的变量。当然,如果是地址,你可以间接取地址保存在变量中,如您的示例所示。)