c语言指针进阶(某习题)

int main() { int *a; int b=123; a=&b; int *c=a; a++; *a=234; printf("%d",*c); return 0; }

这段代码主要演示了C语言中的指针操作。我们可以逐步分析这段代码的行为:

  1. int *a;:声明了一个名为a的整数指针,但此时它并未初始化,所以指向的地址是不确定的。
  2. int b=123;:声明并初始化了一个整数变量b,其值为123。
  3. a=&b;:将b的地址赋给a,所以此时a指向b
  4. int *c=a;:声明了一个新的整数指针c,并将a的值(也就是b的地址)赋给c。所以,现在ac都指向b
  5. a++;:指针a自增1。在C语言中,指针自增1意味着它指向的地址向后移动了指针类型大小的距离。因为ac都是int类型的指针,所以移动了4个字节(假设在32位系统上)。这意味着a现在指向b之后的下一个int位置。
  6. *a=234;:通过指针a给当前指向的位置赋值234。但请注意,由于a已经移动了,它现在指向的是b之后的位置,而不是b本身。因此,这个操作实际上修改了b后面的内存位置,而不是b的值。
  7. printf("%d",*c);:打印指针c指向的值。由于c始终指向b,所以这会打印出b的值,即123。

总结:这段代码虽然对a进行了自增和赋值操作,但这些操作并没有影响到bc。因此,程序最后打印出的值是123,而不是234。同时,这段代码也没有显示地释放任何动态分配的内存,因此从内存管理的角度来看,它也没有问题。但需要注意的是,a指针的移动和赋值操作可能会覆盖其他变量的内存,这在实际编程中是一个需要避免的危险行为。

#include <stdio.h> int main() { int *a; int b=123; a=&b; int *c=a; a++; *a=234; c++; printf("%d",*c); return 0; }

在这段新的代码中,你增加了一个c++操作。现在,让我们分析这段代码的行为:

  1. int *a;:声明一个名为a的整数指针,未初始化。
  2. int b=123;:声明并初始化一个整数变量b,其值为123。
  3. a=&b;:将b的地址赋给a,使a指向b
  4. int *c=a;:声明一个新的整数指针c,并将a的值(即b的地址)赋给c。此时,ac都指向b
  5. a++;:指针a自增1,现在指向b之后的内存位置。
  6. *a=234;:通过指针a给当前指向的位置赋值234。这修改了b后面的内存位置。
  7. c++;:指针c也自增1,现在它指向b之后的内存位置,与a指向相同的位置。
  8. printf("%d",*c);:打印指针c指向的值。由于c现在指向b后面的内存位置,并且这个位置刚刚被赋值为234,所以程序将打印出234。

总结:与之前的代码相比,由于c++操作,指针c现在也指向了b之后的内存位置。因此,printf语句现在打印的是234,而不是123。这个修改展示了指针操作的直接效果,即指针变量自身的变化会影响它们指向的内存位置。在实际编程中,需要非常小心地管理指针,以避免内存访问错误或未定义行为。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值