为什么我的程序不起作用? tptr.c:32:8:警告:传递的指针类型不兼容 “int*”到“int***”类型的参数 [-Wincompatible指针类型] 版次2(**a)//i、 e打印1(&***a);1000 ^~~ tptr.c:2:20:注意:此处将参数传递给参数“b” 无效打印2(内部***b)

为什么我的程序不起作用? tptr.c:32:8:警告:传递的指针类型不兼容 “int*”到“int***”类型的参数 [-Wincompatible指针类型] 版次2(**a)//i、 e打印1(&***a);1000 ^~~ tptr.c:2:20:注意:此处将参数传递给参数“b” 无效打印2(内部***b),c,C,我想你对星星在宣言和表达中的不同含义感到困惑 当你申报时 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 argum

我想你对星星在宣言和表达中的不同含义感到困惑

当你申报时

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) 您将获得类型为
int*
的变量
q
或指向整数的指针。函数参数的声明也是如此。具有原型的函数

int *q = &p;
获取参数
int*
或指向int的指针

使用声明的变量时,只需将变量称为
q
,不带星号。因此,如果要将指向integer的指针
q
传递给函数
f
,该函数需要指向integer的指针,只需说

void f(int *q);
这里,
q
是指针本身。如果要获取指向的值,必须使用解引用运算符(星形:
*q
)解引用
q

声明语法背后的基本原理是“声明模仿使用”,指针的(主要)使用是通过取消引用来获取其内容。(这有点类似于通过在方括号中查找索引值来使用方括号中的维度声明数组。)

运算符的地址(一元
&
)的作用正好相反:它获取变量的地址,以便您可以将其存储在指针中。你(有些做作)的例子做到了这一点;值
p
*q
**r
**a
都是指
p
的值

作为说明,我将您的示例简化了一点:

f(q);
#包括
无效打印0(整数n)
{
printf(“%d\n”,n);
}
无效打印1(int*p)
{
printf(“%d\n”,*p);
}
无效打印2(整数**p)
{
printf(“%d\n”,**p);
}
无效打印3(内部***p)
{
printf(“%d\n”,***p);
}
int main()
{
int p=10;
int*q=&p;
int**r=&q;
int***a=&r;
打印0(p);打印1(p);
打印0(*q);打印1(q);打印2(&q);
打印0(**r);打印1(*r);打印2(r);打印3(&r);
版次0(**a);版次1(**a);版次2(*a);版次3(a);
返回0;
}
查看
print
函数如何以与使用相同的方式声明其参数。并且间接级别为
x
的变量未加修饰地传递给
printx
,即没有任何星号和运算符地址


(您不能多次直接获取变量的地址,因为地址只是一个数字,而不是一个有地址的变量。当然,您可以间接获取包含在变量中的地址,如您的示例所示。)

我没有看到任何程序!错误消息有什么不清楚的地方?什么是
a
?什么是
print2
?他们的声明是什么?三指针。。哇..你真的很喜欢指针的主意。
f(q);
#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;
}