int * 和双 ** 对于 C 函数参数之外的元素意味着什么?



我正在学习C语言并做很多练习。我知道***.c函数中的指针。

请考虑以下功能(另一个.c功能(

void pcc(int* n, int* d, int* family, int* type, double* par, double* nu, double* out)
{
int i, j, in=1, k, **fam;
double *w, **v, t, **theta, **x, **ny;
…some works
}

我的问题是,为什么我们在函数的参数中使用指针?因为据我了解,我们使用指针来指向先前已识别的元素。

另外,为什么我们对函数参数中尚未定义的某些元素使用指针。例如,在最后一个函数中,我们在编写函数参数后定义一个新元素:

int i, j, in=1, k, **fam;
double *w, **v, t, **theta, **x, **ny;

例如,double *w不在函数的参数中!也**v和其他元素。我们怎么知道他们必须得到***.

请帮忙吗?

声明变量 a * 或 ** 的原因数不胜数,最好尝试掌握它们的实际含义,而不是纠结于为什么在这个特定实例中使用它们。

指针*是对存储值的内存位置的引用。在 char 的情况下,它是对保存字节的单个内存位置的引用,而在 int 的情况下,它在 32 位系统上通常是 4 个字节。

可以将指针作为参数传递,以指示这是要存储结果的位置。另一个原因可能是效率。如果你有一个非常大的结构,最好将 4byte(在 32 位系统上(引用传递到结构所在的内存区域,而不是在堆栈上加载整个结构

**是双指针。它指向一个特定的内存位置,该位置本身正在存储其他内容的内存位置。

char a[5];

在这里,变量 a 实际上是一个指向 a[] 的第一个元素的 char *,即 a[0]。

char a[5][5];

这里 a 是一个 char **,指向 a[][] 的第一个元素,即 a[0],它将返回一个指向 a[0][0] 的 char *。

当您想摆弄指针时,第二个示例更好。也许你有一个 char**(一个"字符串数组"(,并且你想替换其中一个"字符串"(字符串只是 c 中的一个 char[](,您只需更改 char** 指向的 char*(。

我希望这能让你更清楚一点。

当我们想要值的位置时,使用指针,而不仅仅是。现在我们为什么要这个?您的问题中实际上说明了一个简单的场景。在 c 中,从函数返回多个值通常不方便(如果不是不可能的话(。一个简单的解决方法是使用指针!例如,当您正常将参数传递到函数中时

int myFunction(int some_parameter);

您实际上是将some_parameter的副本传递到您的函数中。当函数返回时,some_parameter的原始值保持不变。但是,如果我们想更改函数中的some_parameter怎么办?我们改为传递指向值的指针。这允许我们直接更改some_parameter在其原始内存位置的值,而不是副本。所以正如你所看到的,如果我们有

void myFunction(int* parameter1, int* parameter2) {
*parameter1 = 1;
*parameter2 = 2;
}

当您退出函数时,您的值参数 1 和参数 2 将分别为 1 和 2,即使您从未实际返回过值! 指针是关于c最有用和最困难的部分之一,我建议您查阅其他人选择的其他来源,以便了解有关它们的更多信息。

在 C 中,传统上使用指针来修改在与函数不同的作用域声明的变量。

指针指向指针(**(通常在你想以某种方式操作这些地址时使用。

现在至于你的问题:

我们怎么知道他们必须得到***

这取决于你想用数据做什么。如果你想操纵这个值,你只需要一个指针;如果要操作地址,则可能需要指向指针的指针。

最新更新