C语言使用指针赋值的问题
#include <stdio.h>#include <stdlib.h>
int main()
{
int *p,*q;
int a = 2;
int b = 3;
p = &a;
//方法一------
q = &p;
*q = b;
//------------
//方法二
printf("%d\n",*p);
printf("%d",p);
return 0;
}
很困惑在方法一中为什么对p赋值一定要用一个指针变量q来赋值,还有没有其他的途径呢? 本帖最后由 ba21 于 2017-6-19 21:04 编辑
不知道你为啥要搞个p,希望你看了下面能明白
直接 q=&b; 不就好了
--------------------------------------------------------------------------------------------------------
int *p,*q;
int a = 2;
int b = 3;
printf("&p=%p, &q=%p, &a=%p, &b=%p, &p=%p, &p=%p\n", &p, &q, &a, &b, &p, &p);
输出:
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p=CCCCCCCC, &p=CCCCCCD0
这里地址的分配是从高到底,变量的地址是系统自行分配的; &p=CCCCCCCC, &p=CCCCCCD0 得到的是随机值
-------------------------------------------------------------------------------------------------------------------------------------
int *p,*q;
int a = 2;
int b = 3;
p = &a;
printf("&p=%p, &q=%p, &a=%p, &b=%p, &p=%p, &p=%p\n", &p, &q, &a, &b, &p, &p);
printf("p=%p, q=%p, &a=%p, &b=%p, &p=%p, &p=%p\n", p, q, &a, &b, &p, &p);
输出:
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p=0018FF3C, &p=0018FF40
p=0018FF3C, q=CCCCCCCC, &a=0018FF3C, &b=0018FF38, &p=0018FF3C, &p=0018FF40
--------------------------------------------------------------------------------------------------------------------------------------------
int *p,*q;
int a = 2;
int b = 3;
p = &a;
//方法一------
q=&p;
printf("&p=%p, &q=%p, &a=%p, &b=%p, &p=%p, &p=%p\n", &p, &q, &a, &b, &p, &p);
printf("p=%p, q=%p, &a=%p, &b=%p, &p=%p, &p=%p\n", p, q, &a, &b, &p, &p);
输出
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p=0018FF3C, &p=0018FF40
p=0018FF3C, q=0018FF40, &a=0018FF3C, &b=0018FF38, &p=0018FF3C, &p=0018FF40
---------------------------------------------------------------------------------------------------------------------------------------------
int *p,*q;
int a = 2;
int b = 3;
p = &a;
//方法一------
q=&p;
*q = b;
printf("&p=%p, &q=%p, &a=%p, &b=%p, &p=%p, &p=%p\n", &p, &q, &a, &b, &p, &p);
printf("p=%p, q=%p, &a=%p, &b=%p, &p=%p, &p=%p\n", p, q, &a, &b, &p, &p);
输出
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p=0018FF3C, &p=0018FF40
p=0018FF3C, q=00000003, &a=0018FF3C, &b=0018FF38, &p=0018FF3C, &p=0018FF40
走到这里不难看出吧。。搞了半了就是把指针q里面存放的值赋值为3;最后在用数组的形式p来索引该处的值。
还有一点困惑就是,q里面存放的是p的地址,p指的是p里面存放地址的下个一个内存地址吗?*q具体指的是什么呢?{:10_297:} 本帖最后由 zlj19931010 于 2017-6-20 17:03 编辑
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p,*q;
int a = 2;
int b = 3;
p = &a;
//p+1赋值之后,p地址变化了
*(p+1) = b;
printf("%d\n",*p);
printf("%d",p);
return 0;
}
这样的代码执行的时候会自动修改p的地址,如下两图:
本帖最后由 zlj19931010 于 2017-6-20 17:04 编辑
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p,*q;
int a = 2;
int b = 3;
p = &a;
q = &p;
//指针赋值之后,地址都会变化
*q = b;
printf("%d\n",*p);
printf("%d",p);
return 0;
}
这里把变化的指针 转移到了q指针,所以后面访问p就不会有问题了
但是原理不清楚
反汇编一下就可以了 ba21 发表于 2017-6-19 20:06
不知道你为啥要搞个p,希望你看了下面能明白
直接 q=&b; 不就好了
谢谢你的解答{:7_112:},现在还不是很清楚q里面存放的值到底是谁。 本帖最后由 ba21 于 2017-6-20 20:06 编辑
小玉玉 发表于 2017-6-20 19:25
谢谢你的解答,现在还不是很清楚q里面存放的值到底是谁。
不是吧。这么明显的解答你没仔细看吧。我花了不小时间,你不看可惜了
总字一句话就是,q指针指向了自身。 ba21 发表于 2017-6-20 20:04
不是吧。这么明显的解答你没仔细看吧。我花了不小时间,你不看可惜了
总字一句话就是,q指针指向了 ...
我重新思考了一下进行了下面的理解,希望指点{:7_114:}
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*
int *p,*q;
int a = 2;
int b = 3;
p = &a;
//结果:&p=0028FF1C,&q=0028FF18,&p=0028FF18
printf("&p=%p &q=%p &p=%p\n",&p,&q,&p);
//从上面结果看出q和p为同一个内存地址,即同一个变量
//将p的内存地址(也是q自己的),存入q中
q = &p;
//为q指定的内存赋值,也就是q自己所在的内存,赋值为b的值
*q = b;
//通过变量访问内存中的最终值
printf("%d %d\n",p,q);
*/
//去掉p简化思考过程
int *q;
int b = 1;
*&q = b;
printf("%d\n",q);
//总的来说将储存q指针变量的内存空间赋值为b的值
return 0;
}
本帖最后由 ba21 于 2017-6-20 22:29 编辑
小玉玉 发表于 2017-6-20 21:32
我重新思考了一下进行了下面的理解,希望指点
看了你的理解,说明你也已经明白了。
int *q;
int b = 3;
*&q = b;//这种写法没有碰到过。
printf("%d\n",q);
不过改了下你上面的代码
int *q;
int b = 3;
*(&q) = b;
printf("%d\n",q);
运行是正确的。
//通过变量访问内存中的最终值
printf("%d %d\n",p,q); //这里可以理解为 通过指针p 以数组的形式获取 q指针中存放的值(p,p 因为p是一个指针,他的跨度在这里是1个int大小,p的地址-1个int大小刚好就是q的地址)
页:
[1]