标签:
今天在看《Head First C语言》中,书中的代码是*lat=*lat+1;我则写成了*lat++;结果是并不能得到lat指针的内容加一。之后发现原来在C语言中*解指针运算符 与++后自增运算符的优先级是相同的,*p++,后自增运算符++只作用于p,并不能作用于*p(如果*的优先级更高的话才行)。
之后在调试中又发现了一个之前不了解的地方,在C语言中栈的存储是向低地址扩展,也就是先声明的变量在内存中反而内存地址是更大的。
1 #include <stdio.h> 2 void go_south_east(int* lat,int* lon){ 3 //*lat=*lat-1;//把传进来的指针参数解引用 4 //*lon=*lon+1; 5 //*lat++;//在C语言中*解引用与++的优先级是相同的 从右向左结合 6 //*lon--; 7 printf("%p\n",lat);//lat 是在栈中先声明 C语音栈的发展方向是向下 所以后面的变量在内存中的地址是变小的 8 lon++; 9 printf("%p\n",lon); 10 } 11 int main(){ 12 int mylat =10; 13 int mylon=10; 14 15 printf("%p %p\n",&mylat,&mylon); 16 go_south_east(&mylat,&mylon); 17 printf("%p %p\n",&mylat,&mylon); 18 printf("我现在的位置位于%i经度 %i纬度",mylat,mylon); 19 20 21 return 0; 22 }
0022FEBC 0022FEB8 0022FEBC 0022FEBC 0022FEBC 0022FEB8 我现在的位置位于10经度 10纬度 -------------------------------- Process exited after 0.01538 seconds with return value 0 请按任意键继续. . .
由此可见 后声明的变量mylon在内存中的地址是小于mylat的,在方法中将mylon的地址加一,即得到mylat的内存地址。这里也显示了C语言与我之前看的C#书相同的一点,对于方法,传输给一个变量的指针,在方法类可以对指针的内容进行修改,修改可以保留到方法外,而如果对于指针本身进行修改(指向新地址),外面是不会显示改变的,因为传输的终归只是地址的复制。C#中可以对引用类型使用ref和out来指向新引用,当方法为指针返回一个新引用时才有意义。
标签:
原文地址:http://www.cnblogs.com/plantprotecter/p/5021980.html