C语言指针那块地题目,有点乱,不知道调用函数之后带回来的到底是什么?谁能系统的分析下,一步步的,画
#include
//定义类型fun_ptr,它是一个函数指针,指向的函数返回值为int,参数为int
typedef int (*fun_ptr)(int);
//fun1
int fun1(int a)
{
printf("call fun1,pram=%d,return %d+1
", a, a);
return a+1;
}
//fun2
int fun2(int a)
{
printf("call fun2,pram=%d,return %d+2
", a, a);
return a+2;
}
int main(int argc, char *argv[])
{
int a = 10;
int s = 0;
//定义函数指针类型的变量p_fun
fun_ptr p_fun;
//指向fun1
p_fun = fun1;
//执行
s=p_fun(a);
printf("s=%d
", s);
//指向fun2
p_fun = fun2;
//执行
s=p_fun(a);
printf("s=%d
", s);
return 0;
}
执行结果:
这是 C 语言 本身 特性 规定了 的。你只要记住 这点: 形参 必须用指针,这样才能把 通过 函数加工 后的 数值 带回来。通过函数 互换后 的a,b,才能被带回。
至于“为什么”,可以不去追究,它的理由 无非 是什么 地址啦,值啦之类,时间长了,自己会记混淆。
其它语言,例如 fortran 语言,不管形参是什么花样,都能带回。
如果想要透彻理解的话,得先澄清一下C语言的“左值”和“右值”的区别:
左值:赋值运算符左边的表达式,必需是可以求得其存储位置的量,可以是个变量名,或者是个表达式,但必需要能找得到表达式所代表的量的内存位置,比如x,array[i],*p,*(p+i),等等。注意&x并不是一个有效的左值,它虽然求出了一个储存位置,但这里的这个代表储存位置的量,它本身并不存在于任何一个固定的储存位置内,而只是一个临时的量(比如可能会被放在寄存器里),因此不能作为左值出现。其实只要考虑一下,赋值就是把右边的值赋给左边的值所在的地址,显然&&x并不可能求得&x的地址,那么&x也就不能作为左值使用。
右值:赋值运算符右边的表达式,就是个普通的值,可以是变量的值,表达式的值,等等。
第一题见图,第二题比较乱,画图太麻烦,下面用文字解释:
首先k=3,p指向k,调用sp(p)把p(也就是k的地址)传递给了函数sp,这时函数sp的形参a就被赋予了k的地址。
函数sp的局部变量初始化b=2,形参a则被重新赋值为局部变量b的地址(&b)。
语句*a=*a*2进行了一次赋值。左值*a求得b,代表向b的位置赋值。右值*a * 2求得b再乘以2。最后将右值赋给左值,所以这句相当于b=b*2。
所以这时*a等于b等于4,由于C语言是传值调用,函数内修改指针a本身的值并不会影响到指针p指向的地址,因此输出4,3,3。
C语言指针的一道简单题目。 这一程序看不懂,请赐教。
p和q指向同一个位置,输入abc时这个位置上的字符串是abc,输入def时这个位置被def覆盖,所以p和q都输出def。
c语言——关于指针的题目
main(){ int a[12]={1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i;for(i=0;i<4;i++)p[i]=&a[i*3]; \/\/分别把a[0]、a[3]、a[6]、a[9]的地址赋值给 p[0],p[1],p[2],p[3]printf("%d\\n",p[3][2]);因为赋值的时候是把a[9]赋值给p[3]了,输出 p[3]...
C语言指针题目,求解
p+2是a[2]的地址 p+1是a[1]的地址 所以 (p+2)是a[2][0]的地址 (p+1)是a[1][0]地址 两个地址之间相隔了4个元素 所以输出4 注意:p是指向数组的指针
C语言指针,求题目详解
您好,很高兴回答您的问题。您的这个程序,主函数中的第一句话表示p1 和str都是数组名,指向数组中的第一个元素。p2是指针变量,指向的是字符型数据。第二句话表示p2这个指针变量指向的是包含有abc等三个元素的字符型数组。strcpy(str+1,strcat(p1,p2))表示现将p2所指向的内容添加到p1这个数组的...
C语言指针的题目(怎么算的)
void fun(char *a,char *b){ a=b; \/\/ b覆盖了a的原值,也就是b和a都是指向同一个地方,存贮'a'的地方 (*a)++; \/\/a指向的内容加1,'a'变'b'。}
C语言指针问题(初学者)
1.概念问题:指针是指存放地址值的变量或常量;指针与一般变量或常量的区别,在于它不直接存储数值,而是存放被存储数值的地址,属于间接存放,所以不少初学者感觉学习困难。比如:int a=2,b,c,*ptr; ptr=&a;表示将指针ptr指向变量a,存放a的地址,假设是2000H,而指针变量ptr本身也要有地址,假...
【C语言】指针问题,题目见图片,答案是B A为什么不对?求解答!
p1等于a p2等于b A相当与a=b
C语言指针有关问题?
需要注意的是,定义时的int *t中的t代表一个内存地址,这个地址指向的是一个整型数据。若有int *t=5 , t表示内存中指向一个整型数据的地址,此时才能单独用*t,就是表示取出t这个地址中所表示的数,那么就是5。
C语言中的指针问题到底是怎么回事~
怎么样?找出指针的类型的方法是不是很简单? 2。指针所指向的类型。 当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如: (1)int *ptr; ...
c语言程序指针问题
上例中将指针变量b赋给了指针变量a,使a与b都指向分配给b的内存空间,而原先分配 给a的内存空间未释放,不能再被其它任何程序访问,该内存空间成了“无效内存块”,内 存空间“丢失”了,而a后来指向的内存单元又直接或间接地被反复调用,内存愈来愈紧张 ,最终“死机”。解决方法:一个...
谢紫硝酸: 指针不乱啊,可能你被概念迷惑了 p=&i是把i的地址给p,这就叫p指向了i,此时*p就和i等价了,而不是*p指向i int x,*p=&x,这里的*是指针的声明格式,后面是用&x 去初始化p,或者说与前面的赋值格式p=&x结果完全一致,当然就是p指向x,注意这个声明指针时的*p不是表达式中使用的*p,表达式中用的*p代表反引用p指向的内容 另外,由于声明时p前面只有一个*,所以也就是一重指针,后面使用p时前面不能出现两个*的
芙蓉区17364837861: c 语言的指针题 - ?
谢紫硝酸: #include main() {char *s[]={"one","two","three"},*p;//定义一个字符串数组s,和一个指针p p=s[1];//让p指针指向第2个字符串 printf("%c,%s\n",*(p+1),s[0]);//分别输出p指的字符串的第2个字符和第一个字符串 }
芙蓉区17364837861: C语言单向链表那里有点乱?究竟指针是怎么指的??
谢紫硝酸: 指的是键盘
芙蓉区17364837861: 帮忙做一个C语言指针题目?
谢紫硝酸: C,是正确答案 ps是二级指针,在使用指针变量时,*每出现一次,则指针级别减1 对于a答案,ps+1是二级指针,而不是对元素的引用 b答案是一级指针 d答案是1级指针 这是一个简单的理解,因为*指的是取指针所指向内存地址中的内容
芙蓉区17364837861: c语言字符串指针:我对字符指针这方面特别特别混,各位给解释一下下面的: - ?
谢紫硝酸: 首先,一个完整的字符串要以0值结尾,所以你开设char a[8]实际上只能存放7个字符的字符串,最后一个a[7]应当是0表示字符串结尾.那么假设你输入了asdfghj. cin>>a; 在编译器看a的定义知道你要输入字符串,因为a是一个字符型(数组)...
芙蓉区17364837861: c语言指针问题 - ?
谢紫硝酸: 其实这个很好理解的,不要太深究了*P就是一个指针(指向一个内存地址),用指针的时候就是把某个数放到指针的地址中 方法:1. int *p=&a或int *p;p=&a;还可int *p=5;.....当你定义了某一个指针指向某一个数时,在用到的这个数时就直接用指针即*p;例如:int *p=a,c;//求3+5=?和输出5;a=5;c=*p+3;注意输出5时不时输出*p,printf("%d",*p);这是错的*p仅仅只是内存内的一个地址而已是没有数的,假如你这样输出输出的仅仅是这个数在内存内的地址而已.真确的输出printf("%d",a);2.当你调用函数时如果子函数要用到指针形参也是*p哦
芙蓉区17364837861: C语言的指针问题 - ?
谢紫硝酸: 指针,说白了就是储存数据内存段的地址.打个比方说,你家的门牌号是306,那么你家中回来一些客人,这些客人就相当是一些变量,而门牌号就说明了地址,如果张三在你家,另一个人要找到他,那么此时我们只需要告诉那人306,就相当...
芙蓉区17364837861: C语言指针题 - ?
谢紫硝酸: 代码如下,仅供参考:#include<iostream> using namespace std; void fun(int a[],int n,int m) { int i; if(n<=m) { for(i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } else { for(i=n-m;i<n;i++) cout<<a[i]<<" "; for(i=0;i<n-m;i++) cout<<a[i]<<" "; cout<<endl;...
芙蓉区17364837861: C语言关于指针题目?
谢紫硝酸: p=&a[1],表示p指向a[1],即指向4,也即p[0]=4,p[1]=6,p[2]=8,p[3]=10 y+=p[x],即y=y+p[x] 当x=1,y=y+p[1]=0+6=6 当x=2,y=y+p[2]=6+8=14 所以结果是14
芙蓉区17364837861: c语言中的指针,搞不懂,真伤脑筋!帮帮忙,麻烦高人讲解,能够理解透彻,能掌握最好!实在很急! - ?
谢紫硝酸: 给你一个最简单的解释,如果你想联系一个人,你可以有两种方式,第一是直接去找这个人,第二是拿到他的电话去打个电话.直接去找相当于直接去访问这个变量,电话就可以理解为指针.因为通过电话号就能找到这个人.一个人可以有多个电话号,但一个电话号一个时间只能对应一个人.所以一个变量可以有多个指针指向他,但一个指针在一个时间只对应一个变量.另外人是可以更换手机号的,比如销号了或者把这个号转给别人,指针也可以指向不同的变量值,当然因为有空号,所以也有空指针. 具体的你可以看看数吧 :) 我就是给你打个比方,能让你更容易理解.