什么是指针?什么是指向?请叙述c语言中传值调用与传址调用的区别,c语言学习笔记(14)指针基础...

摘要:总结了指针的本质,*的意义,以及传值调用和传址调用的根本区别,利用两个例程加深了理解。

一、指针的本质

指针的本质也是一个变量,只是它里面存放的是一个内存的地址,指针也是需要占用内存空间的,按照平台不同,32位指针变量占四个字节,64位的话一般是8个字节,不同类型的指针变量都是这样。这是因为,我们指针既然是存放的内存的地址,那么理论上我们可以指向系统当中的任意一个内存,既然要做到这样,就要能够访问系统地址空间那么大的内存,所以32位系统是4个字节,无论是char*还是double*的指针变量,都占用4个字节。

二、*的意义

在指针声明的时候,*表示声明的变量为指针,在使用的时候*表示取指针指向的内存地址中的值。

#类似一把钥匙,通过这把钥匙可以打开内存这个房间,取走里面的内容。

下面这个例子可以解释上面的总结:

test.c

#include

int main(void)

{

int i;

int* pI;

char* pC;

double* pD;

pI=&i;

printf("%0x %0d %d%0x,%d,%d,%d\n",&i,*pI,i,&pI,sizeof(int*),sizeof(char*),sizeof(double*));

*pI=10;

printf("%0x %0x %d%0x,%d,%d,%d\n",&i,*pI,i,&pI,sizeof(int*),sizeof(char*),sizeof(double*));

return 0;

}

输出结果如下:

#bf85eadc 13623284 13623284 bf85ead8,4,4,4

#bf85eadc a 10 bf85ead8,4,4,4

可以看到,无论是什么类型的指针变量都是占用四个字节,*pI和i是同一个值,因为pI指向了i的地址,对其*操作自后就是取那个内存里面的值,所以是一样的,对pI取地址可以得到指针的地址,指针也是一个变量,也是需要占用内存的,占用四个字节的大小。

三、传值调用与传址调用

1.指针是变量,因此可以声明指针参数,例如void fun(int* a,int* b)

2.当一个函数体内部需要改变实参的值,则需要使用指针参数

3.函数调用时,实参的值将复制到形参

4.指针适用于复杂数据类型作为参数的函数中

上面的总结是什么意思呢?第一个很容易理解,将指针变量作为函数的参数,在使用的时候我们可以这样fun(&I,&j);这样其实就完成了一次传地址调用,我们可以在该函数内部完成I,j实参的值的修改,这样就是第二点的总结。第三个,函数调用,实参的值复制给了形参,待会儿举个例子说明,最后指针作为复杂数据类型的参数,是因为它的传地址特性,我们不需要将复杂的实参拷贝给形参,能够大大提升效率。

例子如下:

test2.c

#include

void fun1(int a,int b)

{

int i;

i=a;

a=b;

b=i;

}

void fun2(int* a,int*b)

{

int i;

i=*a;

*a=*b;

*b=i;

}

int main(void)

{

int i,j,m,n;

i=1;

j=2;

m=1;

n=2;

fun1(i,j);

fun2(&m,&n);

printf("%d %d\n",i,j);

printf("%d %d\n",m,n);

return 0;

}

输出结果如下:

#1 2

#2 1

输出结果我们可以看到,利用传值调用时没有交换两个变量的值,但是利用传地址调用就可以,原因就是我们上面总结的。那为什么在处理复杂参数的时候,我们要传地址调用呢,假如我们一个程序里面定义了很多的结构体,结构体里面有数组,很多字符串,如果传值调用,需要拷贝到形参,而传地址只需要拷贝几个指针的大小,效率相差了很多倍。

这篇帖子就总结到这里,如有不正确的地方还请指出,大家共同进步!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值