鱼C论坛

 找回密码
 立即注册
查看: 1556|回复: 9

[已解决]C语言使用指针赋值的问题

[复制链接]
发表于 2017-6-19 19:40:22 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int *p,*q;
  6.     int a = 2;
  7.     int b = 3;
  8.     p = &a;
  9.     //方法一------
  10.     q = &p[1];
  11.     *q = b;
  12.     //------------
  13.     //方法二

  14.     printf("%d\n",*p);
  15.     printf("%d",p[1]);
  16.     return 0;
  17. }
复制代码


很困惑在方法一中为什么对p[1]赋值一定要用一个指针变量q来赋值,还有没有其他的途径呢?
最佳答案
2017-6-19 20:06:58
本帖最后由 ba21 于 2017-6-19 21:04 编辑

不知道你为啥要搞个p[1],希望你看了下面能明白

直接 q=&b; 不就好了

--------------------------------------------------------------------------------------------------------
int *p,*q;
int a = 2;
int b = 3;

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
输出:
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=CCCCCCCC, &p[1]=CCCCCCD0
   这里地址的分配是从高到底,变量的地址是系统自行分配的; &p[0]=CCCCCCCC, &p[1]=CCCCCCD0 得到的是随机值
-------------------------------------------------------------------------------------------------------------------------------------
    int *p,*q;
    int a = 2;
    int b = 3;
    p = &a;

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
printf("p=%p, q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", p, q, &a, &b, &p[0], &p[1]);
输出:
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
p=0018FF3C, q=CCCCCCCC, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
--------------------------------------------------------------------------------------------------------------------------------------------
    int *p,*q;
    int a = 2;
    int b = 3;
    p = &a;
    //方法一------
     q=&p[1];

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
printf("p=%p, q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", p, q, &a, &b, &p[0], &p[1]);
输出
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
p=0018FF3C, q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
---------------------------------------------------------------------------------------------------------------------------------------------

    int *p,*q;
    int a = 2;
    int b = 3;
    p = &a;
    //方法一------
     q=&p[1];
    *q = b;

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
printf("p=%p, q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", p, q, &a, &b, &p[0], &p[1]);
输出
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
p=0018FF3C, q=00000003, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40

走到这里不难看出吧。。搞了半了就是把指针q里面存放的值赋值为3;最后在用数组的形式p[1]来索引该处的值。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-19 20:06:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ba21 于 2017-6-19 21:04 编辑

不知道你为啥要搞个p[1],希望你看了下面能明白

直接 q=&b; 不就好了

--------------------------------------------------------------------------------------------------------
int *p,*q;
int a = 2;
int b = 3;

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
输出:
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=CCCCCCCC, &p[1]=CCCCCCD0
   这里地址的分配是从高到底,变量的地址是系统自行分配的; &p[0]=CCCCCCCC, &p[1]=CCCCCCD0 得到的是随机值
-------------------------------------------------------------------------------------------------------------------------------------
    int *p,*q;
    int a = 2;
    int b = 3;
    p = &a;

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
printf("p=%p, q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", p, q, &a, &b, &p[0], &p[1]);
输出:
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
p=0018FF3C, q=CCCCCCCC, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
--------------------------------------------------------------------------------------------------------------------------------------------
    int *p,*q;
    int a = 2;
    int b = 3;
    p = &a;
    //方法一------
     q=&p[1];

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
printf("p=%p, q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", p, q, &a, &b, &p[0], &p[1]);
输出
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
p=0018FF3C, q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
---------------------------------------------------------------------------------------------------------------------------------------------

    int *p,*q;
    int a = 2;
    int b = 3;
    p = &a;
    //方法一------
     q=&p[1];
    *q = b;

printf("&p=%p, &q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", &p, &q, &a, &b, &p[0], &p[1]);
printf("p=%p, q=%p, &a=%p, &b=%p, &p[0]=%p, &p[1]=%p\n", p, q, &a, &b, &p[0], &p[1]);
输出
&p=0018FF44, &q=0018FF40, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40
p=0018FF3C, q=00000003, &a=0018FF3C, &b=0018FF38, &p[0]=0018FF3C, &p[1]=0018FF40

走到这里不难看出吧。。搞了半了就是把指针q里面存放的值赋值为3;最后在用数组的形式p[1]来索引该处的值。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-6-20 13:48:07 | 显示全部楼层
还有一点困惑就是,q里面存放的是p[1]的地址,p[1]指的是p里面存放地址的下个一个内存地址吗?*q具体指的是什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-20 16:41:34 | 显示全部楼层
本帖最后由 zlj19931010 于 2017-6-20 17:03 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int *p,*q;
  6.     int a = 2;
  7.     int b = 3;
  8.     p = &a;
  9.     //p+1赋值之后,p地址变化了
  10.     *(p+1) = b;

  11.     printf("%d\n",*p);
  12.     printf("%d",p[1]);
  13.     return 0;
  14. }
复制代码

这样的代码执行的时候会自动修改p的地址,如下两图:
6BKT02A`6AK6`$V0E]LY1_V.png
BVWV850U7NKIUA7BBCV0CAV.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-20 17:03:15 | 显示全部楼层
本帖最后由 zlj19931010 于 2017-6-20 17:04 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int *p,*q;
  6.     int a = 2;
  7.     int b = 3;
  8.     p = &a;
  9.     q = &p[1];
  10.     //指针赋值之后,地址都会变化
  11.     *q = b;
  12.     printf("%d\n",*p);
  13.     printf("%d",p[1]);
  14.     return 0;
  15. }
复制代码


这里把变化的指针 转移到了q指针,所以后面访问p就不会有问题了

但是原理不清楚


]{9KEQI_4Q8UNA6`ET]4KHT.png
XYU9(E{A@JQ(AZ_[JTA7_@E.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-20 19:17:03 | 显示全部楼层
反汇编一下就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-20 19:25:50 | 显示全部楼层
ba21 发表于 2017-6-19 20:06
不知道你为啥要搞个p[1],希望你看了下面能明白

直接 q=&b; 不就好了

谢谢你的解答,现在还不是很清楚q里面存放的值到底是谁。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-20 20:04:48 | 显示全部楼层
本帖最后由 ba21 于 2017-6-20 20:06 编辑
小玉玉 发表于 2017-6-20 19:25
谢谢你的解答,现在还不是很清楚q里面存放的值到底是谁。


不是吧。这么明显的解答你没仔细看吧。我花了不小时间,你不看可惜了

总字一句话就是,q指针指向了自身。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-20 21:32:28 | 显示全部楼层
ba21 发表于 2017-6-20 20:04
不是吧。这么明显的解答你没仔细看吧。我花了不小时间,你不看可惜了

总字一句话就是,q指针指向了 ...

我重新思考了一下进行了下面的理解,希望指点
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     /*
  6.     int *p,*q;
  7.     int a = 2;
  8.     int b = 3;
  9.     p = &a;
  10.     //结果:&p=0028FF1C,&q=0028FF18,&p[1]=0028FF18
  11.     printf("&p=%p &q=%p &p[1]=%p\n",&p,&q,&p[1]);
  12.     //从上面结果看出q和p[1]为同一个内存地址,即同一个变量
  13.     //将p[1]的内存地址(也是q自己的),存入q中
  14.     q = &p[1];
  15.     //为q指定的内存赋值,也就是q自己所在的内存,赋值为b的值
  16.     *q = b;
  17.     //通过变量访问内存中的最终值
  18.     printf("%d %d\n",p[1],q);
  19.     */

  20.     //去掉p[1]简化思考过程
  21.     int *q;
  22.     int b = 1;
  23.     *&q = b;
  24.     printf("%d\n",q);
  25.     //总的来说将储存q指针变量的内存空间赋值为b的值
  26.     return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-20 21:54:53 | 显示全部楼层
本帖最后由 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[1],q); //这里可以理解为 通过指针p 以数组的形式获取 q指针中存放的值(p[0],p[1] 因为p是一个指针,他的跨度在这里是1个int大小,p的地址-1个int大小刚好就是q的地址)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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