这两题主要考得都是指针和地址。当然这是废话。你还得明白内存图,以及各段所存储的意义。
第一图给你画个图,不过我字写的不好,见谅。。
那个图在fun的时候,main中&b相当于取0x12,,c中存得就为0x12,而0x12中存得值为f,故而*c+1就相当于取出0x12中的值+1,也相当于0x12这个地址里面的值f+1变成g,在main传递a的时候相当于将a的地址0x54传递出去,假定d的地址为0x68,d中存的就为0x54,而d+1的效果为a中存得东西加一,即0x0+1=0x1,而0x1存储的值为G。
而当fun结束后,a这个变量里面所存的地址还是0x0,b存得还为0x12,而0x12中的值已经改变,而0x0中的却始终没变。
第二题类似,希望你自己试着理解一下。
我建议你看《c和指针》,一定要明白内存图。。可以用%p打印变量地址看一下。。
第一题:
fun (&b , a);将b和a传入,注意的是,b是通过引用(取地址的方式)传入的,所以如果在fun中对b进行了修改,那么b的值也会被修改;而a是值传递,a的值在fun中修改后不会影响到a。
于是执行完 fun (&b , a);后,在fun中的输出时g,G,此时跳出fun后,b='g',a='F'。于是后面的输出是F,g 。
第二题:
r指向a[0],执行f()时,r传给p,注意,这里是把r的地址的值传递给p,比如r存入的是100,(r指向a[0],也就是说a[0]的地址是100)执行f()时,就是说p存入的是r的值,所以执行f()时输出的相当于是*(a+3)也就是a[3]的值。而之后的输出,因为r的地址没有改变,所以r还是指向了a[0]。
第一题:
初始值:a='F' , b='f' ;
fun函数执行中输出:'g' , 'G' ; 传入的是 f,F,各加1后输出是g和G
fun执行后,因为第一个参数是传址,所以b加1,变成g,第二个参数是传值,a还是F,所以
输出是F,g
第二题:
传入r等于a,就是数组首地址,加3后就指向4了,所以输出4
在参数中穿入得数组的地址,注意,数组的地址是参数,所以还是传值
r的指向的地址未变还是数组首地址,所以输出还是1
#include
void fun (char *c , int d)
{ *c=*c+1; d+=1;
printf("%c,%c", *c , d);}
main()
{ char a='F' , b='f' ;
fun (&b , a);
prinft("%c, %c\n" , a,b,);
}
首先我们看main函数,他调用了fun函数,fun函数的第一个参数是一个指针变量,第二个参数是int类型;main函数给fun函数的形参是b的地址和a,而在fun函数中,他让b的地址加一,a的值加1。这样说,b的地址是1000,所对应的是f,经过fun函数的处理,b地址加1,变成1001,按照ASCII码表,则对应的是g,故先输出g,然后因为a的值也加1,故输出G;回到main函数,你肯定会认为输出的应该是G,g,错误,输出的因该是F,g,为什么呢,因为一般形参是不会改变实参的值,但当指针作为形参被调用时,会改变实参的值,因为地址改变了。如果还不懂,请翻一下C语言有关函数调用那一章,你会获得更满意的答案。
#include
void f (int *p);
main()
{ int a[5]={1,2,3,4,5},*r=a;
f (r) ;printf ("%d\n" , * r );
}
void f ( int *p )
{ p=p+3;printf ( "%d,",*p);}
答案为:4,1
这里main函数中*r=a这一步很关键,这代表着r的值是等于a数组的地址,默认为指向数组第一个数字即1;在fun中r加上了3,相当于指向了数组中第四个数字,即4,故fun中输出的是4;而在main中,注意,此时形参是数组的地址值,所以还是传的参数,而非指针,由于r是指向a的,所以输出的还是1;
建议你再去看一下C语言中有关于指针当做形参的知识,我很久没用C语言,不知道回答的是否正确。
第一题中c指针指向的就是b的位置改变*c就是改变b,a到d是值传递,改变d对a没影响的;
第二个数组名其实就是一个指针,指向数组第0个元素的位置