双指针和指针数组之间的区别

Difference between double pointer and array of pointers

本文关键字:指针 区别 之间 数组      更新时间:2023-10-16

在普通的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 **

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

推荐阅读:

  • 但我听说char a[]char *a一模一样。
  • 为什么数组和指针声明可以作为函数形式参数互换?
argv是一个

参数,所以数组被衰减到指针,除了大小(int c(之外没有其他方法可以区分。

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

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

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

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

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

p的地址400(&p400(如果我们编写q=p并打印q我们将得到400作为答案,因为q指的是p的地址,*p50渲染为输出,因为operator *指的是"地址值"。现在,假设q有地址500(&q输出500(,因此当我们这样做时: r=qr包含值 500 并且在r前面加上* *r输出应400,因为r呈现存储p地址的 q 的值作为指针变量。

因此
如果在 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方法接受输入,这些输入是char数组数组(或字符串有点通用(。
希望您已经了解其中的区别。如果没有,请评论。我会向你解释的。
谢谢