繁体   English   中英

双指针和指针数组的区别

[英]Difference between double pointer and array of pointers

在普通的 c/c++ 程序中,我们将 main 函数编写为

int main(int c, char **argv)

或者

int main(int c, char *argv[])

这里 argv 表示一个指针数组,但我们甚至使用 ** 表示双指针(指向指针的指针)。

前任:

char p,*q,**r;
q=&p;
r=&q;

这里 r 是一个双指针而不是指针数组。

任何人都可以解释其中的区别吗?

当用作函数参数时

char a[]  // compiler interpret it as pointer to char

相当于

char *a

同样,在main的签名中, char *argv[]等价于char **argv 请注意,在char *argv[]char **argv两种情况下, argv都是char **类型(不是指针数组!)。

声明并非如此

char **r;
char *a[10];

在这种情况下, r是指向char指针的指针类型,而a是指向char的指针数组类型。
那作业

r = a;   // equivalent to r = &a[0] => r = &*(a + 0) => r = a

是有效的,因为在这个表达式中再次数组类型a将被转换为指向其第一个元素的指针,因此类型为char **

永远记住数组和指针是两种不同的类型。 指针和数组等价意味着指针算术和数组索引是等价的。

推荐阅读:

argv是一个参数,因此数组衰减为指针,除了 size ( int c ) 之外别无他法。

当双指针和指针数组不是参数时,它们的语法有时可能看起来相似但它们的类型不同,因此编译器为两者生成不同类型的代码。

当感兴趣的变量不是函数参数时, sizeof将为指向指针和指针数组的指针提供不同的大小。

稍微相关的问题: extern 声明,T* v/s T[]

看! 双指针实际上是这样存储的
让我们说

int p,*q,**r; 
p=50;

p的地址为400&p400 )如果我们写q=p并打印q我们将得到400作为答案,因为q指的是p的地址, *p将呈现50作为输出,因为operator *指的是“地址处的值”。 现在,让我们说q的地址为500&q输出500 ),因此当我们这样做时: r=q r包含值500并且在用**r前缀r时,输出应为400因为r呈现q值,它存储p的地址是一个指针变量。

所以,
如果在 C 程序中我们运行以下代码

int main()
{
   int p,*q,**r; //assume the address of p to be 400
                 //assume the address of q to be 500
   p=50;
   q=p;
   r=q;

printf("Value of p-->%d",p);
printf("\nValue of q-->%d",q);
printf("\nValue at address of q \"in the address displayed above\"-->%d",*p);
printf("\nValue of r \"which will be the address of q\"-->%d",r);
printf("\nValue of r \"which will be the adddress of p-->%d",*r);
printf("\nValue of r \"which will be the value of p\"-->%d",**r);
/*
Please change the format specifiers and replace the specifier from %d to %u in case the address value is not being displayed
*/
return 0;
}

输出
-------
p 值--> 50
q的值--> 400
上面显示的地址中 q 的地址处的值--> 50
r 的值“将是 q 的地址”--> 500
r 的值“将是 p 的地址”--> 400
r 的值“这将是 p 的值”--> 50

通过上面的例子,我只是试图解释双指针的使用。 也许你可能知道这一点我还是把重点讲得很生动

现在利用上面的例子和数组。

数组已经是指针,因为它们可以被引用为 *(a+1) 或 a[1] 。
因此,根据您的问题,双指针可能表示指针数组或字符串数组 双指针符号的使用取决于具体情况。
在您在_TCHAR**argv上方发布的问题中,或者只是char **argv是控制台输入的字符数组,它始终被接受为字符流。
在java中,我们使用类似的东西,比如public static void main(String argv[])
这清楚地表明 main 方法接受输入,这些输入是字符数组(或一般的字符串)。
希望您已经了解其中的区别。 如果不善评论。 我会向你解释的。
谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM