C语言指针理解patr1

本文详细解析了C语言中指针操作的优先级规则,包括解引用运算符*与后自增运算符++的区别,以及栈内存布局的特点,即后声明的变量在内存中的地址更小。通过实例代码演示了指针参数传递、修改以及内存地址的转移,揭示了C语言与C#语言中方法内指针操作的相似之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在看《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来指向新引用,当方法为指针返回一个新引用时才有意义。

转载于:https://www.cnblogs.com/plantprotecter/p/5021980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值