c语言关于地址的问题
发布网友
发布时间:2022-04-29 21:52
我来回答
共6个回答
热心网友
时间:2022-06-23 18:00
看你纠结的,我就回答下吧,这道题考察的是函数参数传递机制:
1、在函数中的形参指针是传进来的指针的副本,也就是说x指向p,y指向q,因此改变x和y指向的内存地址并不会改变p和q指向的内存地址,因此p和q指向的内存地址中的值永远不会变。
2、返回y++和返回y是一样的,区别就是返回之后 这个副本地址y指向的内存地址单元加一,那么你试试返回++y,看看输出结果(原因同下面)
3、返回++x,就是返回了,x(p的副本地址)指向的地址+4。
热心网友
时间:2022-06-23 18:01
举个例子
int* p = 0x0000; //假设,这个地址等于这个
而p++ 相当于p+1,相当于指针p移动了4个字节,所以此时p = 0x0004;
为什么移动4个字节呢,因为,p是个指向整形的指针,所以当指针移动的时候,是按照4个字节移动的,p+2则移动8个字节
若char *p;则p是按照1一个字节移动
p+1.,移动1字节,p+2移动2个字节
回到你的程序,你这里想要在f函数++地址,但你传的是地址的值,若 想改变地址的值,则要传地址的地址,所以你函数执行后,p,q的地址不变,所以*p和*q不变
对于这个不理解的,建议去搜搜 按值传递和按址传递
ps:在32位机上,int是4字节追问我搜了,但是,还是不太懂。。。。
这个程序的目的是什么呢?在这个程序里,都有哪些量改变了?
追答这个程序的目的是,比较两个数值,将返回大的那个值得地址,
但return是讲地址++就不知道为什么了,可能是测试,可能是为了告诉你 按值传递和按址传递
的区别
热心网友
时间:2022-06-23 18:01
同学, 这儿问题我解释一下,有以下几个知识点
1,就像大家说的那样,y++是地址加1
2,你知道你的结果为什么说出2么,而且是永远输出2,
你应该知道这样的结果b = 3
c = b++,这个c的结果是3,这个和你的一样,你的地址是自加运算,而且是后置,所以,你的这句话是r=f(p,q); 相当于r=y ++,所以r得到的地址是y没有加加前的地址,因为y没有加之前,它的指向的值为2,所以,*r=2
3,因为我们定义的临时变量都分配在栈里面,而在main函数里,a=1,b=2,*p,*q,*r,这些 都是临时变量,而且,他们是在栈中(一块内存)从地址高的地方向地址低的地方分配(大端模式,和下端模式,以及编译器的规定有关),所以,你得到的*r是以前的值,
如果你改一下把y++改成++y
根据在栈中分配的特点*r的输出应该是前一个分配单元的值,是1,你可以试试
4,还有你的main函数中q的地址并没有改变,因为所有的参数,传递都是值得拷贝,不过有的书中说的地址传递是指的是地址的拷贝,这里是对q的地址的拷贝所以,你调用函数后,你的q的地址还是没有变化,在main函数中输出还是原值,
好了就说这么多,如果有什么问题,我们在讨论
热心网友
时间:2022-06-23 18:02
++就是y=y+1;
这里返回的不但是y的内容+4,而且把y的值改变了;
但这样编程没有意思
而且运行时,会报错,提示内存错误,该内存不能为“writen”
值++表示,i++表示i=i+1
地址加加表示这个指针变量指向下一个变量的地址
比如,int a[3] , *p=&a[0];
如果写p++;
表示p指向a[1],而不是指向a[0];
*p和*q没有改变;
因为没有写*y或*x的语句
我说完了,希望帮你
热心网友
时间:2022-06-23 18:02
if(*x<*y)
return y++;/*
这里没有对*x、*y也就是a、b进行操作,而是将b的地址返回给r
所以*p=a=1、*q=b=2、*r=*q=b=2
热心网友
时间:2022-06-23 18:03
地址++就是跳到下一个地址,比如 int *y; y++就是跳到下一个整型数的地址,即 y 的值加一个整型数的长度(sizeof(int))。追问如果*y=4,*y++,(*y)++和y++得数是一样的咯?
追答不一样的。
*y++; 取y指向的内存里的值,然后y++
(*y)++ 将 y 指向的内存里的值加一
y++ y本身加一,它原来指向的内存里的值没变,y 指向新的内存单元