经过昨天晚上的奋战,基本上浅浅的说服了自己,二级指针是个什么玩意,
//二级指针的透析
/*
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的值 与 指针所指向内存的上的值 完全是两个概念!!!!!!
所以上边的两种方式输出的值不同。
中间两段测试代码也是一个没有内存四区概念的表现。
最后,学习要保持,不保持就是被干!!!自己丢人都不知道。