二级指针的透析

经过昨天晚上的奋战,基本上浅浅的说服了自己,二级指针是个什么玩意,



//二级指针的透析
/*
1.  int a=5; 计算机会给a分配一块内存存放a的值5,a内存的起始地址加入为100200;
    若int *p=&a;  p是一个指针变量,指向a的地址(100200),但是计算机存放p这个变量也需要开辟内存,p内存的起始地址加入为200300;
如下:
                 100200         5
                 200300   100200
2.   若有一个指针变量指向p的地址(200300),则计算机仍需要开辟内存存放这个变量,假设这个变量的起始地址为400500.
    如下:
       400500    200300
可以表示为:
*q=p;
3. *q=p=&a;那么:**p=*p=a;
*/


//test program  one


int a = 5;
int b = 4;
//实参到形参是进行赋值操作,
//形参会单独开辟一个新的内存,
//只是内存上存的值与实参内存上存的值是一个值。两个地址不同,不是一个变量。
void chang(int *p)
{
p = &b;
}

void main()
{
int *p = &a;
printf("%d", *p);
chang(p);
printf("\n%d", *p);
getchar();
}

*p的值并没有改变。因为其内存地址上的数没有改变。只是change函数中另一块内存地址上的值改变了。


//test program  two
int a = 5;
int b = 4;

//实参到形参是进行赋值操作,
//形参会单独开辟一个新的内存,
//只是内存上存的值与实参内存上存的值是一个值。两个地址不同,不是一个变量。
void chang(int **p)  //1
{
*p = &b;//2
}

void main()
{
int *p = &a;
printf("%d", *p);
chang(&p);//3
printf("\n%d", *p);
getchar();
}

*p的值改变了,因为change函数中操作的就是p内存地址上的值。


简单的来说,要改变一个变量的值,都是改变的是其内存上的值。第一种方法只是改变的另一块内存地址上的值。第二种方法才改变了同一块内存上的值。

操,图片为毛上传不了!


上边的例子完全就是一个误导最典型的例子,没有达到本质

内存四区图帮你解决一切!!!


void chang(int *p)
{


//p = &b;   //改变的是p的值!!!

    //printf("\nssqqqqss%d", *p);
*p= b;     //改变的的是p指向内存的值!!!!
printf("\nss111ss%d", *p);
}

指针p的值      与          指针所指向内存的上的值       完全是两个概念!!!!!!


所以上边的两种方式输出的值不同。


中间两段测试代码也是一个没有内存四区概念的表现。



最后,学习要保持,不保持就是被干!!!自己丢人都不知道。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值