问个简单的指针问题

yoyola 2010-04-25 07:19:31
void change(int *number)
{
*number++;
}

int main()
{
int a=10;
printf("%ld\n",&a);
change(&a);
printf("%ld\n",&a);
}

这2次 输出的 地址 怎么还是一样的啊 后面的地址不是应该比前面的多1吗

...全文
179 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangweiit 2010-04-26
  • 打赏
  • 举报
回复
如果想改变指针的地址,必须使用二级指针的
因为*number,只是改变普通指针批向的内容
**才会改变指针的地址
把你的程序改成这样,就OK了

#include <stdio.h>
#include <iostream>

void change(int **number)
{
(*number)++;
}

int main()
{
int a=10;
int *pa = &a;
printf("%ld\n",pa);
change(&pa);
printf("%ld\n",pa);
getchar();
return 0;
}

huanmie_09 2010-04-26
  • 打赏
  • 举报
回复

#include<stdio.h>

void change(int *number)
{
//*number++;
(*number)++; /*这里是修改number所指向的内容,++的优先级比*要高,应该先取内容,然后自加*/
}

int main()
{
int a=10;
/*printf("%ld\n",&a); */ /*printf打印整型变量格式控制应该为%d, 变量不要取地址*/
printf("%d\n", a);
change(&a);
/*printf("%ld\n",&a);*/
printf("%d\n", a);
return 0;
}
黑夜苍熊 2010-04-26
  • 打赏
  • 举报
回复
因为*的优先级比++高,即在两者同时出现在同一句语句中时,首先运行*再运行++。
在这里,首先实现了*number得a,再实现a++。那么number指向的地址依然为&a
ndjk454164628 2010-04-26
  • 打赏
  • 举报
回复
地址是不会变的
chang函数里自增的是a的值,而不是地址
hyf62399 2010-04-26
  • 打赏
  • 举报
回复
.........
彻底无语,楼主你做的是同一个地址的变量内容的自增运算,地址还是原来的地址。只是内容增加了1
liutengfeigo 2010-04-26
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
想要从本质上理解C指针,必须学习汇编以及C 和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
haoxiang12345 2010-04-26
  • 打赏
  • 举报
回复
要改变地址的值要不用二级指针要用不指针的引用
传值是不能改变地址的
YIDAY 2010-04-26
  • 打赏
  • 举报
回复
要注意运算符的优先级,++比*的优先级高,先进行++运行再进行*操作,得到一个无意义的地址
Beyond_cn 2010-04-26
  • 打赏
  • 举报
回复
这个问题涉及到运算符优先级和按引用传递和按值传递的问题。,。ls们说的都很好。
请叫我卷福 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xzx735 的回复:]
因为*的优先级比++高,即在两者同时出现在同一句语句中时,首先运行*再运行++。
在这里,首先实现了*number得a,再实现a++。那么number指向的地址依然为&a
[/Quote]
*的优先级比++的低。
lz的写法,change里面根本就不能改变a的地址,a是个变量标示符,可以改变a的值,但&a的值不会变。
*number++的意思是先把指针移到a的下一个整形元素(如果存在),然后取它的值(如果存在),可是又没返回,LZ的写法有问题~~~不知啥意思
赵4老师 2010-04-26
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
xero_123 2010-04-26
  • 打赏
  • 举报
回复
想改变指针的值,那就只好做指向指针的指针来改变,你这么把指针改变,只是改变了局部变量,原来的形参不会改变的额。
jldream110 2010-04-26
  • 打赏
  • 举报
回复
不好意思 刚才没看仔细 我以为你要改变 a的 值 你要改变的是a的地址的值 那么得用 指针的指针了
jldream110 2010-04-26
  • 打赏
  • 举报
回复
void change(int *number)
{
* (++number);//这里变成这个就可以了
}

int main()
{
int a=10;
printf("%ld\n",&a);
change(&a);
printf("%ld\n",&a);
}

// *number++ 先执行 number++,指针指向的地址变了 ,但是 取指针指向的内容还是number的 不是++以后的, 换成*(++number) 就可以了 以前我写一个单片机的程序 这里也出过一次错误
stubborn_forever 2010-04-25
  • 打赏
  • 举报
回复
一,&a这是一个常地址,是不可改变的
二,即使是可以改变的,你也要有返回值。因为形参传地址的主要意义在于你要改变地址里面的值,而你要改变的是地址,所以可以这么做
#include "stdio.h"
int * change(int *number)//返回值是指针类型的函数
{
return ++number;//注意这里要将++number,而不是number++,这就是这两个运算符的差别

}
void main(void)
{
int a=10;
int *p=&a;//p是一个指针变量
printf("%ld\n",p);
p=change(p);
printf("%ld\n",p);
}
qzf368 2010-04-25
  • 打赏
  • 举报
回复
形参传值啊不改变,你传的是地址,那地址一定不变
lnjzhrh 2010-04-25
  • 打赏
  • 举报
回复
5楼说的很正确,不过你要是真想改变地址值的话,你可以这么写
#include "stdio.h"
void change(int **number)
{
number++;
}
void main(void)
{
int a=10;
int *p=&a;
printf("%ld\n",p);
change(&p);
printf("%ld\n",&a);
}
longx_ok 2010-04-25
  • 打赏
  • 举报
回复
顶3楼的,函数调用后就被释放掉了,所以白搭。还有一个就是4楼所说的,常量地址不允许++的
Hewie 2010-04-25
  • 打赏
  • 举报
回复
你这么做 只是相当于把指针指向的值即 a的值进行了自加操作
而且a的地址是在定义时就分配好的,是个常量,是无法改变的。
borden 2010-04-25
  • 打赏
  • 举报
回复
void change(int *number)
{
*number++;
}

int main()
{
int a=10;
printf("%ld\n",&a);
change(&a);
printf("%ld\n",&a);
}

你调用了change,只是改边了a中的值,而a的地址没有变,
*number++, 指针number虽然是指向下一个了,但是没有返回给a,
当子函数change调用结束后,number被释放了,
加载更多回复(2)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧