首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C,指针数组: int n[5],int *p[5],p[i] = &n[i],为什么*p与p相同?

C,指针数组: int n[5],int *p[5],p[i] = &n[i],为什么*p与p相同?
EN

Stack Overflow用户
提问于 2016-02-18 05:47:04
回答 3查看 116关注 0票数 1

对不起,我看错了我的结果,*p和p是不同的

我试着理解一系列的指针。

我写

代码语言:javascript
复制
int n[5] = {1,2,3,4,5};
int *p[5];
for(i = 0; i < 5; i++){
    p[i] = &n[i];
}

到目前一切尚好。

我明白

代码语言:javascript
复制
printf("%0x\n", *p);

给出数组中第一个指针的地址。

困扰我的是,p,只是p,没有星号,没有括号。

因为

代码语言:javascript
复制
printf("%0x\n", *p);
printf("%0x\n", p);

给我同样的东西。为什么p也是数组中第一个指针的地址??错了,对不起!

当上面这样的指针数组被声明时,p到底是什么意思?

一个相关的问题

代码语言:javascript
复制
int main(int argc, char *argv[]){
    for(int i = 0; i < argc; i++){
        printf("%s\n",argv[i]); //why not *argv[i]??
    }
}

既然argv被声明为一个指针数组,那么argv[i]不应该生成地址而不是它所指向的字符串吗?因为它前面没有星号。

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2016-02-18 05:51:14

p,只有p,没有星号,没有括号给出数组p[]的第一个元素的地址。另一方面,根据您显示的代码,*p给出了数组p[]的第一个元素的值,这恰好是数组n[]的第一个元素的地址。

让我们以一个例子为例,假设整数大小为4字节,地址if为8字节,以及您展示的第一个程序。

代码语言:javascript
复制
int n[5] = {1,2,3,4,5};
int *p[5];
for(i = 0; i < 5; i++)
{
    p[i] = &n[i];
}

数组看起来会是这样的。(假定地址是为了解释的目的,它们不是真实的)。

代码语言:javascript
复制
n[] = { 1,  2,  3,  4,  5};  //these are integers
     // ^   ^   ^   ^   ^
    // 100 104 108 112 116    these are the addresses of the elements of array n[]

p[] = { 100, 104, 108, 112, 116}; // these are pointer to integers
     //  ^    ^    ^    ^    ^
     // 200  208  216  224  232   these are adddress of the elements of array p[]

现在,p,只要p,没有星号,没有括号会给出值200,它是数组p[]的第一个元素的地址。

像wise一样,n会给出100的值。

*p将给出值100,它是存储在数组p[]的第一个位置的元素。

票数 4
EN

Stack Overflow用户

发布于 2016-02-18 05:51:09

当您只使用p时,它会衰减到指向数组p中的第一个元素的指针,也就是说,p等同于&p[0]

当您取消引用该指针时,您将得到存储在p[0]中的指针。也就是说,当您执行*p时,这与执行*&p[0]是一样的,运算符的取消引用和地址--每个操作符的删除和地址--只给出了p[0],在您的情况下,这等于&n[0]

还请注意,当您想要使用printf打印指针时,您应该使用"%p"格式(并真正传递void *作为参数)。

不相关的问题是,因为argv是指向字符的指针数组。对于任何有效的索引i,表达式argv[i]为您提供一个char *类型的指针。如果取消引用这个指针,就会得到argv[i]指向的字符,即单个字符。

票数 1
EN

Stack Overflow用户

发布于 2016-02-18 05:57:54

给予,

代码语言:javascript
复制
int n[5] = {1,2,3,4,5};
int *p[5];
for(int i = 0; i < 5; i++){
   p[i] = &n[i];
}

printf("0x%p\n", *p);
printf("0x%p\n", p);

预期的输出肯定不是相同的。

我得到了

代码语言:javascript
复制
0x0x7fffe0c40b40
0x0x7fffe0c40b60

在我的桌面上。

如果我用:

代码语言:javascript
复制
printf("%0x\n", *p);
printf("%0x\n", p);

使用gcc -Wall编译时会收到以下警告

代码语言:javascript
复制
soc.c: In function ‘test’:
soc.c:12:4: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
    printf("%0x\n", *p);
    ^
soc.c:13:4: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int **’ [-Wformat=]
    printf("%0x\n", p);

即使如此,我还是得到了以下输出:

代码语言:javascript
复制
3ef18920
3ef18940

正如你所看到的,它们是不一样的。

也许,由于使用不正确的格式说明符,您正在看到未定义行为的症状。

请参见http://ideone.com/73UoDa中这两种表单的输出。

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

https://stackoverflow.com/questions/35473789

复制
相关文章

相似问题

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