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

时间:2015-11-03 05:03:36

标签: c++ c arrays 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是双指针而不是指针数组。

任何人都能解释一下这个区别吗?

3 个答案:

答案 0 :(得分:5)

用作功能参数时

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 **类型的指针。

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

建议阅读:

答案 1 :(得分:2)

argv是一个参数,因此数组被衰减为指针,除了大小(int c)之外没有办法区分。

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

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

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

答案 2 :(得分:0)

看! 双指针实际上就像这样存储了。让我们说

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包含值500r前缀为**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;
}
  

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数组的数组(或字符串到有点普遍)。
希望你已经理解了差异。如果不是善意评论。我会向你解释。
谢谢