多语言展示
当前在线:447今日阅读:126今日分享:42

指针的一些经验

本文讲了一些关于C/C++指针的经验
工具/原料

C/C++

步骤/方法
1

内存。  要理解指针,就要先弄明白内存,内存就是一段存储空间,顺序的。而内存地址,就是一个数字,从0开始,直到内存的最大值,比如我的内存是2G,地址就是从0到(2G-1)。这个地址就像是门牌号一样,通过这个地址就能找到内存里真正储存的东西。

2

指针。  然后是指针。指针是一种特殊的变量,但它也是变量,所以它也要符合变量的要求(不能是关键字,必须以下划线或者字母开头,不能包含特殊字符)这就说明了int* p,中p是int*类型的。下面通过举例来说明一下指针。  设:int a=4;  int* p=&a;  如下图,在内存中可以成为这样(当然由于本人水平有限,而且只是为了说明一下问题,就不那么严格了,像char是1位,int是4位这样的都忽略掉了,都假设存在一个内存区域中,所有变量的地址均为假设):这可以看出来,p里其实存的是a的地址。大家都知道*p是取p指向的内容,当调用*p时就像是问路一样,本来是想用a的内容,但是不知道a在哪(或者其他原因),所以去问p,p就把a的地址3002告诉了你,这样,你根据这个地址就找到了a,再从a里面取出来内容4,这样就完成了*p的过程,也就是寻址。如果不是在赋初值,要写成p=&a;这应该称为类型一致,p是指针类型,保存的是地址,而a是值类型,所以要把a先取地址(就是用&)再赋值给p。而反过来a=*p,同理,把地址类型改为值类型(当然你可以说是取出地址里的值,我这只是一种理解方式)。如果*p=a;而p没有初值时,就会出错,因为p会有一个随机的地址值,这相当于把a的值赋给了p那个随机的地址里,系统一般不允许这样做(这样做很有可能就把正常的程序给搞坏了)所以是不正确的,当然如果你的p已经指向了一个正确的地址,就没问题了。

3

指针与普通变量的区别(当*p变化时,a的值也会改变)  因为p指向的是a,所以当出现*p=8;时,并不是把p里的内容改成8,p里存的是3002,是a的地址,所以更改的是3002地址的值,也就是a的值,这样,a最终也就成了8;  而如果是int b=a;//此时是b有自己的地址,假设是3003,  b=8;//这时只改了3003地址的值,而3002的并没有变化,所以a的值仍然是4,而不是8;

4

指针作为函数形参与普通变量作为函数形参  所谓形参,就是在函数声明或定义时括号里的参数,实参则是在函数调用时那个括号里的参数 Code: void test(int *point, int general)//这是一个函数,有两个形参,一个是指针类型,一个是普通类型,我们再定义两个变量  {  *point = 2;  general = 2;  }  void main()  {  int num1=num2=1;//两个整型变量,初值都为1;  test(&num1, num2);  printf('num1=%d, num2=%d', num1, num2);  }  这个的执行结果是num1=2, num2=1; 还是前面的说法,参数传递是值传递。根据上面的图  test函数里的point是地址类型,把num1的地址给了它,所以point里存的是3002,而general是值类型,就把num2里的值复制给了它,所以general里存的是1;  这样,当执行函数test时,point改变的是它指向的地址里的值,也就是3002里的值,所以num1就跟着改变了,而general改变的只是它自己的值,所以4005地址里的1会变成2,而num2还是1.

5

还有个很关键的就是指针与数组,或者指针与指针。  这两个差不多,就放在一起了。  设int a[3] = {1,2,3}; int* p=a; 或者 int* a=(int*)malloc(sizeof(int)*3); int* p=a;//后者假设a中也存的是1,2,3  此时的图如下:P指向的是数组a的首地址,也就是a[0](后面那个用指针表示的a也可以用这种下标的方式来获取里面的值)。  大家都知道,a就表示数组a的首地址,和&a[0]等价,所以,如果不是在赋初值时,就可以写成p=a;或者p=&a[0];这和上面2中的有区别,但最终的还是一样,都是地址类型,类型一致。 现在p指向的是a的首地址。当p++时,3002会自增1,因为是p加加 ,而不是*p,p的值就是3002,所以就会取3003地址的内容,当然就是a[1]的内容了。而这样做的好处就是,当你p的值随便改变时,当然对应的数组里的值就会改变,这时再重新引用a里的值时自然是改变后的,而无论p怎么改(指针移动),a仍然是首地址,和以前的引用方式一样,不用再把p移动回去。

6

总结。  最后就像大家看到的,主要是因为数据在内存中的存储方式永远都是顺序的,从0开始加上去的,指针也是一个变量,里面只是存储的是地址,而不是常规意义上的一个值。如果在函数调用的时候想不起来是用&,还是光写变量,就一定要记住“类型一致”哦,这个可是绝对正确的。

推荐信息