c函数指针-小白问个关于C指针的问题

问题描述

小白问个关于C指针的问题
point(char *p)
{
p+=3;
}
main()
{ char b[4]={'m''n''o''p'}*pt=b;
point(pt);
printf(""%cn""*pt);
}

本以为答案是p,但是为什么是m?
答案解释是因为这次调用函数是值传递而不是址传递,为何?(*p)+3倒是可以输出p,但是为什么呢?不用函数调用,使用p+3也可以输出p。函数调用到底发生了什么,用指针好迷糊。

解决方案

应该这样理解,把指针传递,传递的是指针的地址,p是地址,可以认为是形参,它是你传入的那个指针地址的一个副本,所以改变*p时,指针指向的内容也会改变。
但是如果 改变指针的地址,比如这里的p+改变以形参,实参是不会发生改变的

解决方案二:
如果你想改变pt的值变成'p',你应该把这样:
point(char **p)
{
p+=3;
}
main()
{ char b[4]={'m''n''o''p'};
char *pt=b;
point(&pt);
printf(""%cn""*pt);
}
这样就能改变指针的值。

解决方案三:
你需要得到m,有两个写法
(1)

point(char &*p)

(2)
*p='m';

解决方案四:
在point()里只可以改变*p,不可以改变p,所以那个p+=3相当于没用。

解决方案五:
(1)你传指针的引用,会改变实参的指针
(2)你修改指针,不会影响实参的指针。但是修改指针指向的内容会影响原来的数组。

解决方案六:
point()函数调用时将pt的形参传递过去,不会影响实参的值,也就是说无论point()函数内部怎么改变,变量的作用范围是函数的内部。

解决方案七:
point函数只能修改p指向的内容,对于指针本身修改的是拷贝,所以无效,你需要传char**二级指针

解决方案八:
当年学指针那叫一个痛苦啊。指针修改不会改变实参。

解决方案九:
在main里边这么调用: point(*pt)

时间: 2024-11-01 05:27:35

c函数指针-小白问个关于C指针的问题的相关文章

小白问一下关于c++的windows界面编程的问题

问题描述 小白问一下关于c++的windows界面编程的问题 本人刚刚开始自学windows界面编程,用的编译器是vs2012.问了同学决定从winform入手,但是刚开始就被这些头文件啊源文件啊什么的给搞晕了.本来打算今晚写出来一个程序,但是一直在纠结这个参数传递,下面先上代码,非常简单的一个程序. 解决方案 你用winforms就要按照winforms的来,首先,不同于你在学校学的那个C++,winforms有自己的程序入口,无需再写main函数. 你新建了一个窗口,直接放上去按钮.文本框(

c-C语言函数的相关问 为什么b返回乱码??

问题描述 C语言函数的相关问 为什么b返回乱码?? #include #include #define P 20 char *ph(char a[20],int k,int m) { int i; char b[20]; for(i=0;i<k;i++) { b[i]=a[i]; } b[k]=''; printf("%s ",b); return b; } int main() { char *q; char ch[P]; int k,m; printf("请输入&q

retinex-单尺度RETINEX的算法中不同代码的高斯函数的形式问什么不同,MATLAB代码

问题描述 单尺度RETINEX的算法中不同代码的高斯函数的形式问什么不同,MATLAB代码 有没有相关的代码.为什么高斯核的形式不一样 [x y]=meshgrid((-(size(Ir,2)-1)/2):(size(Ir,2)/2),(-(size(Ir,1)-1)/2):(size(Ir,1)/2)); gauss_1=exp(-(x.^2+y.^2)/(2*sigma_1*sigma_1)); %计算高斯函数 Gauss_1=gauss_1/sum(gauss_1(:)); %归一化处理

c语言-C语言:小白问一个问题

问题描述 C语言:小白问一个问题 代码如下 #include void search(float (*p)[4],int n) { int i,j,k; for(i=0;i<n;i++) { k=0; for(j=0;j<4;j++) if(*(*(p+i)+j)<60) k=1; if(k==1) { printf("the falied student numbers are No.%d ",i+1); for(j=0;j<4;j++) printf(&qu

android小白问一个故障

问题描述 android小白问一个故障 android小白,做一个很简单的动作,第一个activity里面输入的内容传递到第二个activity的textview中去,但是报错如下 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object ref

数据库-小白问个服务器方面的小问题--就是登录慢,跪求大神解决!

问题描述 小白问个服务器方面的小问题--就是登录慢,跪求大神解决! 访问web站点的时候,特别慢,大概10分钟才会有反应,通过测试数据库连接是没问题的.日志如下:[Wed Nov 04 15:28:26.473310 2015] [mpm_prefork:notice] [pid 1888] AH00163: Apache/2.4.2 (Unix) PHP/5.5.7 configured -- resuming normal operations[Wed Nov 04 15:28:26.473

link中的函数不是相当于静态函数么?为什么还可以调用成员函数,之前问错了,谢谢

问题描述 link中的函数不是相当于静态函数么?为什么还可以调用成员函数,之前问错了,谢谢 link中的函数不是相当于静态函数么?为什么还可以调用成员函数,之前问错了,谢谢 解决方案 关键是哪个类的成员函数和哪个类的静态函数.不能调用成员函数是指别的类的,如果这个函数在自己类的成员函数中调用,就可以.

c-C语言函数的相关问 为什么b返回乱码

问题描述 C语言函数的相关问 为什么b返回乱码 #include #include #define P 20 char *ph(char a[20],int k,int m) { int i; char b[20]; for(i=0;i<k;i++) { b[i]=a[i]; } b[k]=''; printf("%sn",b); return b; } int main() { char *q; char ch[P]; int k,m; printf("请输入&quo

c++-C++小白关于C++ primer中指针交换的问题

问题描述 C++小白关于C++ primer中指针交换的问题 C++primer第五版的6.22题,要求是交换两个int指针.#includevoid exchange(int *&xint *&y);void exchange(int *&xint *&y){ int *z; z=x; x=y; y=z;}int main(){ using namespace std; int *p; int *t; int i=10; int j=20; *p=i; *t=j; exc