komodo 发表于 2020-8-27 18:01:13

指针数组地址疑问

本帖最后由 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

komodo 发表于 2020-8-28 13:09:39

本帖最后由 komodo 于 2020-8-28 13:12 编辑

后来的同学可以看如下代码,如果你也搞清楚了的话,看到如下代码也会豁然开朗的{:5_109:}
#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 = %p\n", &p);
    printf("\n");
    printf("*p       = %p\n", *p);
    printf("p   = %p\n", p);
    printf("&p = %p\n", &p);
    printf("\n");
    printf("*p       = %s\n", *p);
    printf("p   = %s\n", p);
    printf("\n");
    printf("**p   = %c\n", **p);
    printf("*p   = %c\n", *p);
    printf("p = %c\n", p);


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

*p       = 0x105d56ef8
p   = 0x105d56ef8
&p = 0x105d56ef8

*p       = dalian
p   = dalian

**p   = d
*p   = d
p = d
*/

sunrise085 发表于 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;
}

komodo 发表于 2020-8-28 13:07:49

sunrise085 发表于 2020-8-27 19:03
因为你这个*p[]是一个指针数组
对于数组来说,数组名就是取数组的地址,使用&符号也是取地址,因此这两个 ...

非常感谢!
页: [1]
查看完整版本: 指针数组地址疑问