我正在尝试编译一个程序,该程序将指针设置为指针,指针的指针为指针,指针的指针为指针,指针的指针为指针的指针。 (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查看调用)
答案 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