理解什么是指针(地址)是相当容易的,一个十一岁的孩子可以理解它。但是我们如何表达为什么我们需要一个指向指针的指针呢?什么是非常教学的例子?它是否扩展到指向指针(和/或继续)的指针?
Tundefined不衰减到T**
brainfuck command C equivalent
(Program Start) char array[30000];
char *ptr=array;
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr=getchar();
[ while (*ptr) {
] }发布于 2013-02-04 17:10:15
指针允许您讨论某些信息,而无需显式地指定该信息:
指向指针的指针允许您讨论某物的位置,而无需显式地指定该位置:
指针的一种简单易懂、实用的用法是,当您希望其他函数或方法为您提供指向某个数据段的指针时。与其直接要求数据(毕竟,它可能非常大),你可以直接询问数据的地址。您可以这样说:这是我希望您更改的指针的地址,以便它指向我想要的数据。用街道地址类比,就像告诉你的朋友:
请在便笺上写上你的住址。
短语“此便笺垫”指定特定存储空间的位置,因此它就像一个指针。一旦地址被写下来,就像一个指向你朋友家的指针。
指向指针的另一个常见示例(在Brian的注释中指出)是多维数组。例如,在C中,字符串是以空结尾的字符数组,而字符串变量只是指向数组的第一个元素的指针。如果您想要构建一个字符串数组,您可以创建一个指针数组,每个指针指向一个不同的字符串。如果您想要一个二维的字符串数组,您可以重复这个过程并创建一个字符串数组。
能够谈论地址可以在代码和现实世界中使用更复杂的表达式。
发布于 2013-02-03 06:22:28
有时被称为句柄,Windows和Mac使用这种结构允许堆上的内存压缩。程序管理指针p,操作系统管理指针*p。由于操作系统管理* p,所以可以移动p ( *p )所指向的块,并且*p可以更改以反映移动,而不使用p。指向指针的指针也经常在C中用于处理函数中的指针参数。
http://computer.howstuffworks.com/c32.htm
发布于 2013-02-03 07:46:38
如果您有一个指针,并且您想要调用一个修改指针的函数,您需要告诉该函数指针存储在哪里。为了告诉函数的存储位置,需要获取指针的地址,它是指向指针的指针。
int foo(const char **error_message)
{
if (!bar())
{
// The type of error_message is const char ** (the parameter)
// The type of *error_message is const char * (the caller's msg)
// The type of **error_message is const char ('N' from "No error")
// Note here, I have a * before error_message, it changes the callers msg
// *error_message is the caller's msg variable
// reading or writing *error_message will read/write msg
// before this line executes, msg points to the first character of "No error"
// after this line, msg points first character of "bar failed"
*error_message = "bar failed";
return -2;
}
return 0;
}
int main()
{
// make a variable 'msg' and point it to the first character of "No error"
const char *msg = "No error";
// Get the address of 'msg' and pass it to foo.
// '&msg' is a pointer to 'msg' (which happens to be a pointer).
int status = foo(&msg);
// foo could have modified msg, since it knew the address of msg
if (status < 0 && msg != 0)
printf("%s\n", msg);
}在我的示例中,调用方需要将指针传递给msg (指针指向指针),这样foo就可以将指针设置为指向错误消息。
这个想法和指针的任何使用都是一样的。如果您希望一段代码能够在任意地址上进行读写,则需要传递一个指针。指向指针的指针,只指向指针。
https://softwareengineering.stackexchange.com/questions/185702
复制相似问题