1
main()
{
int a[]={5,4,3,2,1};
int *p[]={a,a+1,a+2,a+3,a+4 };
int **ptr=p;//what does it really means
cout<<a<<*a;/*prints the address of a, value of a[0] (i understand this line)*/
cout<<endl<<p<<*p<<**p;/*prints the address of p, address of a, value of a[0]    (understands this line's logic too)*/
cout<<endl<<ptr<<*ptr<<**ptr;\*this line's o/p is same as the previous one cant   understand why*/
}

请解释 **ptr 是什么意思以及为什么第三行的输出与第二行相同。

还有一个疑问:

  1. int *ptr=(char *)0;
  2. float *ptr=(float *)0;
  3. char *ptr=(char *)0;

我在一篇文章中读到,这些都是空指针(char *)表示的所有表示。

4

3 回答 3

3

数组在多个上下文中衰减为指向它们的第一个元素的指针,包括您在其中使用它们的表达式上下文。如果我们在其中几行中明确使用&array[0]而不是单独使用array,也许会更有意义。首先,声明ptr

int **ptr = p;     // ptr is a pointer to the first element of p
int **ptr = &p[0]; //   and this expression is equivalent.

接下来,打印p和朋友——同样,这两种表达方式是相同的。

cout << endl << p << *p << **p;
cout << endl << &p[0] << *&p[0] << **&p[0];

现在,打印ptr行 - since ptris &p[0],您可以看到这两行是等价的:

cout << endl << ptr << *ptr << **ptr;
cout << endl << &p[0] << *&p[0] << **&p[0];

第二行与上面的第二行相同 - 因此您的输出相同。

您可能会受益于阅读comp.lang.c常见问题解答第 6 节,数组和指针

于 2013-06-15T21:27:06.760 回答
1
int **ptr=p

指向 int 的指针

int *p[] 在您的示例中保存指针数组,int 数组 a 的地址。

您的示例中相同输出的原因。**ptr 和 *p[0] ara 相同。* ptr == * (ptr +0) == ( (p+0)) == **p //都指向数组a的第0个元素。

于 2013-06-15T21:23:40.103 回答
-1

取自http://www.eskimo.com/~scs/cclass/int/sx8.html

` 因为我们可以有指向 int 的指针,指向 char 的指针,以及指向我们定义的任何结构的指针,实际上指向 C 中的任何类型的指针,所以我们可以拥有指针也就不足为奇了到其他指针。如果我们习惯于考虑简单的指针,并在头脑中清楚指针本身和它所指向的内容之间的区别,那么我们也应该能够考虑指向指针的指针,尽管我们现在必须区分指针,它指向什么,以及它指向的指针指向什么。(当然,我们也可能最终得到指向指向指针的指针,或指向指向指针的指针的指针,尽管这些很快变得太深奥而没有任何实际用途。)指针指向指针的声明看起来像 int **ipp; 其中两个星号表示涉及两个级别的指针。从熟悉的、平淡无奇的幼儿园风格的例子开始,我们可以通过声明一些指向它的指针和一些指向这些指针的 int 来演示 ipp 的使用:

int i = 5, j = 6; k = 7;
int *ip1 = &i, *ip2 = &j;

现在我们可以设置

ipp = &ip1;

ipp 指向指向 i 的 ip1。*ipp 是 ip1 ,而 **ipp 是 i 或 5。

...

在实践中,指向指针的指针有什么用?一种用途是从函数返回指针,通过指针参数而不是作为正式的返回值。为了解释这一点,让我们先回过头来考虑通过指针参数从函数返回简单类型(例如 int)的情况。如果我们写函数

f(int *ip)
{
*ip = 5;
}

然后这样称呼它:

int i;
f(&i);

然后 f 将通过将值 5 写入调用者传递的指针指定的位置来返回值 5;在这种情况下,调用者的变量 i 。如果一个函数有多个要返回的东西,它可能会以这种方式返回值,因为一个函数只能有一个正式的返回值(也就是说,它只能通过 return 语句返回一个值。)需要注意的重要一点是为了让函数返回一个 int 类型的值,它使用了一个指向 int 的指针类型的参数。现在,假设一个函数想要以这种方式返回一个指针。相应的参数必须是指向指针的指针。例如,这是一个小函数,它尝试为长度为 n 的字符串分配内存,如果失败则返回零(false''),如果成功则返回 1(非零或 true''),

#include <stdlib.h>
int allocstr(int len, char **retptr)
{
char *p = malloc(len + 1); /* +1 for \0 */
if(p == NULL)
return 0;
*retptr = p;
return 1;
}

然后调用者可以做类似的事情

char *string = "Hello, world!";
char *copystr;
if(allocstr(strlen(string), &copystr))
strcpy(copystr, string);
else fprintf(stderr, "out of memory\n");

(这是一个相当粗略的例子;allocstr 函数并不是非常有用。调用者直接调用 malloc 会很容易。另一种更有用的方法是围绕 malloc 编写包装函数以我们一直使用的 chkmalloc 函数为例。)`

于 2013-06-15T21:26:38.413 回答