首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双指针和指针数组的区别

双指针和指针数组的区别
EN

Stack Overflow用户
提问于 2015-11-03 05:03:35
回答 2查看 6.4K关注 0票数 14

在一个普通的c/c++程序中,我们将主函数写成

代码语言:javascript
复制
int main(int c, char **argv)

代码语言:javascript
复制
int main(int c, char *argv[])

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

例:

代码语言:javascript
复制
char p,*q,**r;
q=&p;
r=&q;

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

有谁能解释一下这种区别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-03 14:50:13

当用作函数参数时

代码语言:javascript
复制
char a[]  // compiler interpret it as pointer to char

等于

代码语言:javascript
复制
char *a

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

声明中的情况并非如此。

代码语言:javascript
复制
char **r;
char *a[10];

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

赋值

代码语言:javascript
复制
r = a;   // equivalent to r = &a[0] => r = &*(a + 0) => r = a

是有效的,因为在此表达式中,同样,数组类型a将转换为指向其第一个元素的指针,从而转换为char **类型的指针。

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

建议阅读:

  • 为什么数组和指针声明作为函数形式参数可互换?
票数 10
EN

Stack Overflow用户

发布于 2015-11-03 05:09:17

argv是一个参数,因此数组被分解为指针,除了size (int c)之外,没有其他方法来区分。

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

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

略微相关的问题:v/s T[]

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33491687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档