指针传递参数实例:
成都创新互联公司专注于光泽网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供光泽营销型网站建设,光泽网站制作、光泽网页设计、光泽网站官网定制、微信小程序开发服务,打造光泽网络公司原创品牌,更为您提供光泽网站排名全网营销落地服务。
void fun1( int *p ) //此函数接受一个指针p,也就是说p是别人传过来的一个int类型的地址
{
printf(" %d", p); ///打印p的值,注意p是地址,所以打印的是一个内存地址
printf("%d", *p); ///打印指针p所指向的内存单元的值,那要看p是谁传过来的,它以前值是多少?
*p = 0; ///把p所指向的内存单元赋值为0
}
main()
{
int a = 90; ///定义一个整形变量,存放90
fun1( a) ; //调用fun1函数,并把变量a的地址传递过去
//注意,a刚开始存放的是90,执行完后a内容就变成0了
}
希望能帮到你,望采纳哈!
首先,int *num[] 是指针数组 ,存放的是数组元素a[0]-a[5]的地址。
再说sort 参数,传入的是数组num的首地址 ,以及 n 要排序的元素个数。
if(*num[k]*num[j])里 ,num[i]为对应数组元素a[i]的地址,显然*num是取a[i]的值,也就是说
*num[k]等同于a[k],不同的是,如果你传入的形式是a[i],只是单纯的形参,变量存放在堆栈中,单纯的交换了变量的值,当函数运行结束后,会释放掉堆栈,这些变量值也就被释放掉,所以实际a中内容也没有改变。如果传入的是地址,同样指针也是4字节的形式(32cpu int 地址32位,64位cpu指针就是64位的地址)存放在堆栈,但下面的交换代码里是对这些地址所在位置的值 ,即储存a的内存元素进行交换,这就是你说的a内容里面的值也被交换了,当函数运行结束后,堆栈也被释放,指针也就不存在了。但a的作用域在该函数外,即使该函数结束,也没有权利释放掉a所在内存,所以a的值被交换,就是永远的被交换了。你调用sort(a)明显也是对地址进行操作的,也是会改变a里面的值。至于形参和实参的问题,形参永远不会影响实参的,即使形参与实参的名字相同,也不会分配到内存同一个地址,函数结束形参就随着栈的销毁而销毁,会对实参造成影响是因为是直接对某个内存地址就行了操作,直接修改了某个内存地址的值。
如果以上看不懂,那么你要好好的看下数据结构 ,做为程序员,正真要弄懂指针,必须也要明白内存中是怎么存放的。虽然操作系统的mmc内存管理使编程员很少直接对内存去操作,而高级语言变量在内存的存放又被编译器做了,但有些东西不知道,你就无法理解,更别谈编程了。
何况现在很少的学校有开设数据结构这门课。。我也很纳闷,数据结构和算法导论都不学的,何谈编程,何谈程序员。。。。。。
对c指针的讲解,建议你看下c和指针 ,还是不错的一本书,前面都是基础,可以忽略,后面涉及指正的部分还是很精华的。
至于第2个问题:这是数组指针里面的东西了,想要弄懂就去看我说的那本书吧。我简单说下:
int a[10];
int *p ;
p=a; 这你应该懂 ,就是普通的指针。*p就是 a 数组的首地址a[0]。*(p+1)就是a[1];
*p[10],可以理解为数组p[10],每个元素均为指针,即这个数组存放的元素也均为指针 ,
这里有10个数组a[10],b[10],c[10].....
p[0]=a,
p[1]=b,
............
p[9]=c,依次元素p[0]-p[9]均为指针 分别指向10个数组,即a,b,c.......
因此 *p 代表p数组的p[0]元素,不懂参考上面的普通指针
*(p+1)代表p[1]元素,*(p+2) 就是p[2].
但这只是寻址p 怎么寻址a呢
p[0]就是a p[1]就是b ......
所以 *p 是a 那么**p就是 *(p[0]) 就代表 a[0] *(*p+1) 就是 *(p[0]+1)代表a[1]
*(p+1)是b 那么 **(p+1)就是*(p[1]) 是b[0] *(*(p+1)+1) 就是*(*p[1]+1))就是b[1]
这里懂了 那么上面你的问题就很简单了
但是不幸的是,这只是一维数组指针。。。。指针还涉及到 函数指针,多维数组的指针,等等,灵活运用指针可以很容易的设计程序结构,使得代码也更紧凑,所以说指针是c的精华,想要弄懂确实不易,但真正明白本质,“指针即地址”这句话,你再回头看这些,其实也不难,而且很简单。
总之就是多看代码,多写代码 ,多看书,祝君好运!!!
可以,但子函数中要谨慎处理,不然会出问题,如
int fun( int *p )
{
//if ( *p !=0 ) 错误的引用方法,会导致程序异常
if ( p *p ) //正确的引用方法,保证p不是NULL时才读。
return 1;
return 0;
}
void main()
{
int x=fun(NULL) ;
}
经常用到的time(NULL); 也是传NULL指针的一个应用。