如何设置多个指针?

时间:2019-07-12 14:38:24

标签: c pointers compiler-errors

我正在尝试编译一个程序,该程序将指针设置为指针,指针的指针为指针,指针的指针为指针,指针的指针为指针的指针。 (9次)

我尝试删除代码块并添加putchar和printf而不是write。我也尝试包括stdio.h库,但不会编译。我仍然不太了解指针。

#include<stdio.h> // Adding a library here

void ft_ultimate_ft(int *********nbr); // Defining the ultimate function

int main(void)
{
  *nbr [9], // Defining the array for all pointers 
    *nbr[0] = 42 // Defining the final destination
    *nbr[1] = &nbr[0]
    *nbr[2] = &nbr[1]
    *nbr[3] = &nbr[2]
    *nbr[4] = &nbr[3]
    *nbr[5] = &nbr[4]
    *nbr[6] = &nbr[5]
    *nbr[7] = &nbr[6]
    *nbr[8] = &nbr[7]

   write(1, *nbr[8], 1);
   return(0);
}

我原本只是想得到一个42,但是却得到了这个错误代码。 ld:找不到架构x86_64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

2 个答案:

答案 0 :(得分:3)

#include <stdio.h>


void ft_ultimate_ft(int *********nbr)
{
    printf("The pointer is %p.\n", (void *) nbr);
    printf("The number is %d.\n", *********nbr);
}


int main(void)
{
    ft_ultimate_ft(
        &(int ********) {
         &(int *******) {
          &(int ******) {
           &(int *****) {
            &(int ****) {
             &(int ***) {
              &(int **) {
               &(int *) {
                &(int ) { 42 } } } } } } } } }
        );
}

不要这样做。

上面使用了复合文字。复合文字的形式为( 类型 ) { 初始化器列表 }。复合文字会创建一个对象,除了源代码中的文字文本外,没有其他名称。例如,int x = 42;创建一个名为int的{​​{1}}对象,其初始值为42,而x创建一个名称不为(int) { 42 }的对象,其初始值为42

创建对象后,我们可以使用int来获取其地址,因此&是具有值42的&(int) { 42 }的地址。然后可以将其用作类型为int的复合文字,我们可以使用它的地址并使用它来生成类型为int *的复合文字,等等。

答案 1 :(得分:0)

尝试这样的事情。:)

#include <stdio.h>
#include <stdint.h>

void f( void *p, size_t n )
{
    while ( n-- ) p = ( void * )*( intptr_t * )p;

    printf( "%li\n", *( intptr_t * )p );
}

int main( void )
{
    enum { N = 9 };
    intptr_t nbr[N];

    nbr[0] = 42;
    for ( size_t i = 1; i < N; i++ ) nbr[i] = ( intptr_t )&nbr[i-1]; 

    f( ( void * )nbr[N-1], N - 2 );
}

程序输出为

42