#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)
答案 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
未加修饰,即没有任何星号且没有地址操作符。
(你不能直接获取变量的地址不止一次,因为地址只是一个数字,而不是一个带有地址本身的变量。当然,如果是地址,你可以间接取地址保存在变量中,如您的示例所示。)