首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的多个间接方向级别

C中的多个间接方向级别
EN

Stack Overflow用户
提问于 2021-01-31 18:13:20
回答 3查看 375关注 0票数 0

为了真正掌握C中的指针,我尝试了多个级别的间接方向。我了解基本知识:

代码语言:javascript
复制
#include <stdio.h>

void indirection(int * n)
{
    *n = 3;
}

int main ()
{
    int n;

    indirection(&n);
    printf("Your number is %d\n", n);

    return 0;
}

但我想把它说到极致,想要写一个函数:

代码语言:javascript
复制
void indirection(int ****n)
{
   ****n = 3;
}

设置n的值,并在main中打印它,但是我总是得到分段错误和其他错误。

那么,我应该如何声明n的main,以及如何使用它的值?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-31 18:27:36

indirection()函数的参数类型是int ****,即指向int的指针,它只不过是int ***类型变量的地址。所以,

int ****类型变量可以保存int ***类型变量的地址。

int ***类型变量可以保存int **类型变量的地址。

int **类型变量可以保存int *类型变量的地址。

int *类型变量可以保存int类型变量的地址。

你可以:

代码语言:javascript
复制
#include <stdio.h>

void indirection(int ****n) {
    ****n = 3;
}

int main (void) {
    int n = 0;
    int *p1 = &n;
    int **p2 = &p1;
    int ***p3 = &p2;

    indirection (&p3);

    printf ("Your number is %d\n", n);

    return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2021-01-31 18:26:45

指针必须指向某些东西(一个对象),而不仅仅是一个值,因此您不能使用多个&运算符“动态”创建它们。要获得指向指针的指针,必须首先定义指针,然后获取其地址。要获得进一步的指针,您必须重复如下:

代码语言:javascript
复制
#include <stdio.h>

void indirection(int ****n)
{
    ****n = 3;
}

int main(void)
{
    int     n;
    int    *np  = &n;
    int   **npp = &np;
    int ***nppp = &npp;

    indirection(&nppp);
    printf("Your number is %d.\n", n);

    return 0;
}

也就是说,有一种方法可以动态地创建对象,使用复合文字。这是因为复合文字不是计算某些操作的普通操作数,而是创建临时对象的一种方法:

代码语言:javascript
复制
int main(void)
{
    int n;
    indirection(& (int ***) { & (int **) { & (int *) { &n } } });
    printf("Your number is %d.\n", n);
}
票数 2
EN

Stack Overflow用户

发布于 2021-01-31 18:39:56

您还没有展示如何调用修改后的indirection(),但是seg-错误几乎可以肯定地归结为您是如何调用函数的。

如果您像在原始main()中那样调用它,您应该得到一个警告:

代码语言:javascript
复制
warning: passing argument 1 of ‘indirection’ from incompatible pointer type [-Wincompatible-pointer-types] 

就像你所观察到的那样,这很可能是断层。waring正在告诉您一些关于代码语义的内容。

坦率地说,我不会为这一不明智的努力而绞尽脑汁。让我们举一个更简单的例子:

代码语言:javascript
复制
void indirection(int** n)
{
   **n = 3;
}

如果你能做到这一点,你可以一步一步地推断出更高层次的间接方向。

给这个电话打电话可能是这样的:

代码语言:javascript
复制
    int n ;
    int* pn = &n ;

    indirection( &pn ) ;

    printf( "Your number is %d\n", n ) ;

要添加进一步的间接方向,您需要实例化另一个级别指针:

代码语言:javascript
复制
    int n ;
    int* pn = &n ;
    int** ppn = &pn ;

重点是在每一个层次,你需要一些具体的指向。例如,不能只添加&,例如:

代码语言:javascript
复制
indirection(&&n);

因为&n - address-of n是有意义的,而&&n地址--地址-- n没有意义,因为&n不是一个存储的变量,需要取一个地址。它实际上不会编译。

这就是为什么-我会把原因留给你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65982615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档