在一个普通的c/c++程序中,我们将主函数写成
int main(int c, char **argv)或
int main(int c, char *argv[])这里,argv表示一个指针数组,但我们甚至使用**表示双指针(指向指针的指针)。
例:
char p,*q,**r;
q=&p;
r=&q;这里r是一个双指针,而不是指针数组。
有谁能解释一下这种区别吗?
发布于 2015-11-03 14:50:13
当用作函数参数时
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 **类型的指针。
请记住,数组和指针是两种不同的类型。指针和数组等价意味着指针算法和数组索引是等价的。
建议阅读:
发布于 2015-11-03 05:09:17
argv是一个参数,因此数组被分解为指针,除了size (int c)之外,没有其他方法来区分。
当双指针和指针数组不是参数时,它们的语法有时可能类似,但它们的类型不同,因此编译器为两者生成不同类型的代码。
当感兴趣的变量不是函数参数时,sizeof将为指针指针和指针数组提供不同的大小。
略微相关的问题:v/s T[]
https://stackoverflow.com/questions/33491687
复制相似问题