为了真正掌握C中的指针,我尝试了多个级别的间接方向。我了解基本知识:
#include <stdio.h>
void indirection(int * n)
{
*n = 3;
}
int main ()
{
int n;
indirection(&n);
printf("Your number is %d\n", n);
return 0;
}但我想把它说到极致,想要写一个函数:
void indirection(int ****n)
{
****n = 3;
}设置n的值,并在main中打印它,但是我总是得到分段错误和其他错误。
那么,我应该如何声明n的main,以及如何使用它的值?
发布于 2021-01-31 18:27:36
indirection()函数的参数类型是int ****,即指向int的指针,它只不过是int ***类型变量的地址。所以,
int ****类型变量可以保存int ***类型变量的地址。
int ***类型变量可以保存int **类型变量的地址。
int **类型变量可以保存int *类型变量的地址。
int *类型变量可以保存int类型变量的地址。
你可以:
#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;
}发布于 2021-01-31 18:26:45
指针必须指向某些东西(一个对象),而不仅仅是一个值,因此您不能使用多个&运算符“动态”创建它们。要获得指向指针的指针,必须首先定义指针,然后获取其地址。要获得进一步的指针,您必须重复如下:
#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;
}也就是说,有一种方法可以动态地创建对象,使用复合文字。这是因为复合文字不是计算某些操作的普通操作数,而是创建临时对象的一种方法:
int main(void)
{
int n;
indirection(& (int ***) { & (int **) { & (int *) { &n } } });
printf("Your number is %d.\n", n);
}发布于 2021-01-31 18:39:56
您还没有展示如何调用修改后的indirection(),但是seg-错误几乎可以肯定地归结为您是如何调用函数的。
如果您像在原始main()中那样调用它,您应该得到一个警告:
warning: passing argument 1 of ‘indirection’ from incompatible pointer type [-Wincompatible-pointer-types] 就像你所观察到的那样,这很可能是断层。waring正在告诉您一些关于代码语义的内容。
坦率地说,我不会为这一不明智的努力而绞尽脑汁。让我们举一个更简单的例子:
void indirection(int** n)
{
**n = 3;
}如果你能做到这一点,你可以一步一步地推断出更高层次的间接方向。
给这个电话打电话可能是这样的:
int n ;
int* pn = &n ;
indirection( &pn ) ;
printf( "Your number is %d\n", n ) ;要添加进一步的间接方向,您需要实例化另一个级别指针:
int n ;
int* pn = &n ;
int** ppn = &pn ;重点是在每一个层次,你需要一些具体的指向。例如,不能只添加&,例如:
indirection(&&n);因为&n - address-of n是有意义的,而&&n地址--地址-- n没有意义,因为&n不是一个存储的变量,需要取一个地址。它实际上不会编译。
这就是为什么-我会把原因留给你。
https://stackoverflow.com/questions/65982615
复制相似问题