/* ============================================================================ Name : TestPointer.c Author : lf Version : Copyright : Your copyright notice Description : 指针的入门和理解 一个程序载入内存时,系统会为变量和函数均分配内存,所以每个变量和函数都有其对应的内存 地址. 所以在C语言中有一个很常见的操作&就是用来取地址的; 而*是操作是用来:根据地址取出该内存地址对应的内存单元中的数据. 即*操作根据地址取出内容 小结: int num=9527; int *p=# 1 既然&操作是为了取变量的地址. 比如语句&num,num是一个变量&num就是取变量的地址. 那么*p操作也是类似的原理. *操作是根据地址取出内容 比如语句*p,p就是一个地址;*p就取出了该地址里保存的数据. 所以p和&num是等价的!!!! 2 为什么在*p前面有一个int修饰呢? 因为p仅仅是一个开始地址,这里int就告诉了程序访问的范围 即从p这个开始地址开始,到(p+int类型的长度)的地址作为结束. ============================================================================ */ #include <stdio.h> #include <stdlib.h> int main(void) { testPointer(); pointerSize(); return EXIT_SUCCESS; } /** * &num取变量的地址. * 其实&num也是一个指针,它就指向了num.参见: * printf("*(&num)=%d,num=%d\n",*(&num),num); * * int num=9527; * int *p=# * 要清楚一点: * &num是一个常量,但是p是一个指针变量可以存储一个地址 */ void testPointer(){ int num=9527; int *p=# //指针p本身在内存中的地址 printf("&p=%x\n",&p); printf("===========\n"); //p中保存了num的地址.所以p和&num等价!!!! printf("p=%x,&num=%x\n",p,&num); printf("===========\n"); //*p,得到p中保存的地址且取出改地址里保存的值. //所以*p和num等价 printf("num=%d,*p=%d\n",num,*p); printf("===========\n"); /** * 由上小结: * 1 既然&操作是为了取变量的地址. * 比如语句&num,num是一个变量&num就是取变量的地址. * 那么*p操作也是类似的原理. * 2 *操作是根据地址取出内容 * 比如语句*p,p就是一个地址;*p就取出了该地址里保存的数据. * 所以上面的例子中可以看到p和&num是等价的!!!! */ //因为&num是一个地址,其实也是一个指针,指向了num //所以用 *(&num)取出该指针指向的值. //*(&num)和num是等价的 printf("*(&num)=%d,num=%d\n",*(&num),num); printf("===========\n"); } /** * 指针的大小. * 指针是一个地址,所以它都是32为的. * int *int_pointer * char *char_pointer; * double *double_pointer; * 它们都是32位的,代表了一个开始地址!!! */ void pointerSize(){ int *int_pointer; char *char_pointer; double *double_pointer; printf("int_pointer size=%d\n",sizeof(int_pointer)); printf("char_pointer size=%d\n",sizeof(char_pointer)); printf("double_pointer size=%d\n",sizeof(double_pointer)); printf("===========\n"); }