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 指向新的内存单元
C语言地址运算问题
1. 地址加整数:整数表示移动的单位数。对于二维数组,例如定义了一个数组 `a[][]`,`a` 能代表数组的一行,`a+1` 表示向后移动了一行,即 `a[1]`,也就是 `a[1][0]` 的地址。2. 数组元素管理:`a[i]` 是以单个元素为单位进行管理的,`a[i]+1` 表示以 `a[i][0]` 为起始...
c语言数组、地址问题请高手解释?
定义了数组a,则机器在内存当中给数组a开辟一片内存存储数组a,数组a的元素是顺序存储的,所以说数组a所在的地址就是数组a第一个元素所在的地址,这两个指针(&a,&a[0])其实算是指向同一个地址的,所以打印出来的数值是相同的。p应该是64位32进制形式输出,%d是十进制形式输出的。&a[0]跟a其实...
c语言 地址问题
1. 指针是存储的地址;2. L是定义的一个结构指针, L.elem引用有语法错误, 应该是L->elem 3. &是取址运算符; SqList中的成员elem也是个整型指针, 若是要得到elem的值(也就是elem指针的内容), 应 p = L->elem, 则p存的地址和elem存的地址相同, 也就是指定内存同一地址, *p和*(L->elem...
C语言输出地址问题
首先,printf("i的地址为:%p",i);不是输出地址,而是输出i的值,但是会以16进制输出。如果输出i地址,应该是 printf("i的地址为:%p",&i);而%d就是以十进制输出i的值
C语言中地址的问题!~
include<stdio.h> main(){ int *p,i;p=&i;printf("%p\n",p); //%o是8进制格式输出,%p是按地址格式输出 } 你说的很对,输出的是i的地址,即指针变量P的值 此地址为一个系统自动分配的地址,在系统的堆栈区,而不是动态存储区
C语言里地址的问题
数组的(首)地址就是数组名,比如int s[10],s就是地址。指针,p是指针本身,*p才是指针这个空间(房间中,p有自己的房间号,*p是p的房间里面存的一个房间号)中的存储的地址。但是真正用的时候,一般不用地址做运算,都是用地址里面的数据。gets(s)也是对这个地址的连续空间里面进行数据的输入。
关于c语言,地址问题?
地址和地址上存储的字节是两个不同的概念 内存是按照字节进行编址 可以认为所有字节排成一排,每个字节的编号就是地址值 所以地址是32还是64位与地址上能存多大东西没关系 至于为什么按照字节编址,是因为一个字节可以表示0-255共计256个数字,在很多情况下,比如字符串,用字节就够了 如果按照32位进行...
C语言,地址问题
p表示数组的首地址,a也表示数组的首地址,所以p+1与a+1表示a[1]或者p[1]的地址。如果表示a[1]值则用*(p+1)或*(a+1)
C语言地址运算问题
地址+整数,这里的整数代表的是向后移动的单位数,二维数组的各个地址是这样的:比如定义了一个数组a[][],a能够为数组的一行代言,a+1就向后走一行变成a[1]了,也就是a[1][0]的地址,a[i]是以单个的元素为单位进行管理的,那么a[i]+1就是以a[i][0]为起始点向后走一个元素所占的字节...
地址的问题 C语言
答案是 D 1a6 - 194 = 12 这是十六进制 因为打印显示的是十六进制结果 十六进制 12 就是十进制 18 清楚了吧