二刷指针概念时候遇到了理解上的困难,,需要大家指点迷津了,万分感激
对指针地址和指针值的疑惑如下:
int main(void){
//定义指针变量存储变量地址
int i= 10;
int* p = &i;
printf(" i(10)=%d\n",i);
printf(" p(16)=%x\n",p);
printf(" &i(地址)=%p\n",&i);
printf(" p(地址) =%p\n",p);
printf(" &p(地址)=%p\n",&p);
return 0;
}
结果如下:
i(10进制)=10
p(16进制)=61fe1c //问1:这里用16进制输出为什么得不到存在p中的,i的地址?
答:其實地址已經得到,只是位數不一樣而已、我著相了。詳細信息見大家評論。
&i(地址)=000000000061FE1C
p(地址) =000000000061FE1C
&p(地址)=000000000061FE10
问题1在代码注释
p的地址是p的”值“(也就是i的地址)。。
我目前认为:(”%p“,p),(“%p”,&p)两者都是p的地址, 输出p应该和输出&p的结果一样 。
所以p的地址 ,&p的地址 为什么不同?
答:想要得到一個變量的16位完整地址,就必須使用&符 加 變量名!(指針地址為&p)
指針的值:是別人的"地址",既然是地址,就必須要用%p來得到他的 「16位地址真實本相」; %x也有效果,但是得到的是內存地址高位沒有自补0,的部分值。(這個%x的輸出值只有有效數字)
问4:我设i=10.p指向i。用%x,输出p的值,结果居然不是我想像的p的“值”(i的地址),为什么会这样?
答:你其實得到了地址,只是這個地址的格式不是完整的16位數。格式不便於理解,但是他的有效位數和地址一樣喔。
你得到的是舍弃地址高位0後的 有效位數,(單純的16進制數)。初學接觸到的地址高位都是0,
(指针的值是被指物的地址,这个概念是正确的吗?)
答:正確,
结果为什么不是?
答:你需要用地址格式%p,来输出指針所代表的地址值。這就是指針的值,
int a=10;
int *p=&a;
那么p的值是a的地址
而&p是p的地址
能明白吗
比如a的地址是0,p的地址是1
那么地址0里面存的是10,是a的值
而地址1里面存的是0,是a的地址
而&p的值是1,不是0也不是10
-=-=-=
如果你声明的是个数组,数组指针的值就是它自身的地址,那么p和&p就相等了
%p 是 C 语言中的格式控制符,用于输出指针变量的地址。而 & 是取地址符号,用于获取变量的地址。
当使用 %p 输出一个指针变量 p 时,它会输出该指针变量所指向的内存地址,也就是指针变量的值。而当使用 &p 获取指针变量 p 的地址时,它会输出指针变量 p 自身的地址。
因此,%p 输出的是指针变量所指向的内存地址,而 &p 输出的是指针变量本身的内存地址,它们是不同的。
例如,假设有如下代码:
int a = 10;
int *p = &a;
printf("%p\n", p);
printf("%p\n", &p);
输出结果将会是类似如下的地址值:
0x7ffd7af9e12c
0x7ffd7af9e130
第一个 printf 语句输出的是指针变量 p 所指向的内存地址,即 a 的地址;而第二个 printf 语句输出的是指针变量 p 自身的内存地址。
p里面储存地址,%p打印的是p里面储存的地址
而&p是取出了p的地址,%p打印的是p它自己本身的地址
如果觉得有用,望采纳,谢谢
總結如下:。p值雖然是16進制數,但是
%p輸出p, ("%p",p)結果是 p所代表的地址。不是p自身地址。
%p輸出&p,("%p",&p)結果是 p指針本身,不指向其他變量時的原始位置。
雖然地址是16進制數,但是最好不要用%x輸出p,
因為%x不能輸出完整的p的值,在我的機器上,%x輸出的數比%p輸出的地址要短幾位。
#include<stdio.h>
int main(){
int i= 10;
int* p=&i;
printf("p值 =%p\n",p);
printf("p十六進制=%x\n",p);
return 0;
}
結果:
p值 =0x280ecca40
p十六進制=80ecca40
雖然%x得到的值 和%p得到的值 的前幾位一樣,
寫法printf(" %x",p);