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

在普通的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 **argvargv的类型为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相同。
  • 为什么数组和指针声明可以作为函数forms参数互换?

argv是一个参数,所以数组被衰减为指针,除了size( 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=q r包含值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; } 

OUTPUT
——-
p – > 50的值
q – > 400的值
地址q“在上面显示的地址中”的值 – > 50
r“的值将是q的地址 – > 500
r“的值将是p的地址 – > 400
r“的值将是p的值 – > 50

通过上面的例子,我只是试图解释双指针的使用。 也许你可能知道这仍然让我的观点生动

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

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