鱼C论坛

 找回密码
 立即注册
查看: 859|回复: 3

[已解决]指针数组地址疑问

[复制链接]
发表于 2020-8-27 18:01:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 komodo 于 2020-8-27 18:01 编辑

【疑问】
为什么p和&p的结果相等?
【我的想法】
p指向指针p1自身的地址,那p的值就是p1所在的地址,同时p自己就是个指针,也会占用内存,也会拥有自己的地址,所以&p应该打印指针p自身所在的地址,但是结果p和&p打印的结果一致,按理说&p和p的值是两个不同的地址啊,望赐教。
int a = 10;
int b = 2;
int c = 22;
int *p1 = &a;    
int *p2 = &b;    
int *p3 = &c;    
int *p[] = {p1, p2, p3};

printf("p  = %p\n", p);
printf("&p = %p\n", &p);

//结果如下
//p  = 0x7ffee0767700
//&p = 0x7ffee0767700
最佳答案
2020-8-27 19:03:16
因为你这个*p[]是一个指针数组
对于数组来说,数组名就是取数组的地址,使用&符号也是取地址,因此这两个结果是一样的
这个想不明白的话,可以写一个一般的数组,看看,或许就明白了。
因为指针数组也是数组
#include <stdio.h>
int main(void) { 
    int p[] = {1,2,3};
    printf("p  = %p\n", p);//这个是取数组地址
    printf("&p = %p\n", &p);//这个也是取数组地址
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-28 13:09:39 | 显示全部楼层
本帖最后由 komodo 于 2020-8-28 13:12 编辑

后来的同学可以看如下代码,如果你也搞清楚了的话,看到如下代码也会豁然开朗的
#include<stdio.h>
#include<string.h>
int main(void){
    char *p[] = {
        "dalian",
        "shenzhen",
        "guangxi"
    };
    printf("p     = %p\n", p);
    printf("&p    = %p\n", &p);
    printf("&p[0] = %p\n", &p[0]);
    printf("\n");
    printf("*p       = %p\n", *p);
    printf("p[0]     = %p\n", p[0]);
    printf("&p[0][0] = %p\n", &p[0][0]);
    printf("\n");
    printf("*p       = %s\n", *p);
    printf("p[0]     = %s\n", p[0]);
    printf("\n");
    printf("**p     = %c\n", **p);
    printf("*p[0]   = %c\n", *p[0]);
    printf("p[0][0] = %c\n", p[0][0]);


    return 0;
}
/*
p     = 0x7ffee9ea96b0
&p    = 0x7ffee9ea96b0
&p[0] = 0x7ffee9ea96b0

*p       = 0x105d56ef8
p[0]     = 0x105d56ef8
&p[0][0] = 0x105d56ef8

*p       = dalian
p[0]     = dalian

**p     = d
*p[0]   = d
p[0][0] = d
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 19:03:16 | 显示全部楼层    本楼为最佳答案   
因为你这个*p[]是一个指针数组
对于数组来说,数组名就是取数组的地址,使用&符号也是取地址,因此这两个结果是一样的
这个想不明白的话,可以写一个一般的数组,看看,或许就明白了。
因为指针数组也是数组
#include <stdio.h>
int main(void) { 
    int p[] = {1,2,3};
    printf("p  = %p\n", p);//这个是取数组地址
    printf("&p = %p\n", &p);//这个也是取数组地址
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-28 13:07:49 | 显示全部楼层
sunrise085 发表于 2020-8-27 19:03
因为你这个*p[]是一个指针数组
对于数组来说,数组名就是取数组的地址,使用&符号也是取地址,因此这两个 ...

非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表