变量:只是一段存储空间的别名
指针的本质:
*本质也只是一个变量
*需要占用一定的内存空间
*用于保存内存地址值
*的意义
1指针的声明 *号表示所声明的变量为指针 ( int*p=&i 声明p为指针变量 &i为取i的地址)
2在指针使用的时候 *号表示取指针所指向的内存空间所存储的值(j=*p 取指针变量p所指向的内存空间所存储的值)
【声明一个指针变量后,给这个变量赋值必须是地址,指针变量只保存内存地址。
*号类似一把钥匙,通过这把钥匙可以打开内存,读取内存中的值,指针变量就像一个门。不同类型的门的大小都是一样的。门后面则是一片大的内存空间,门保存的是一个地址值。*号钥匙可以打开这扇门,读取门后面的内存空间】
形参和实参
1 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
2 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
3 实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。
4 在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。
传值调用和传址调用
C语言中所有的参数都是传值调用,
实参的值“拷贝”给函数的形参。函数
运算中是对形参进行操作,实参的值在运算中不会发生变化但这种方式,有时候也会带来麻烦。如下例交换函数:
#include
void swap(int a,int b) //int a,int b 为形参
{
int t;
a=t;
a=b;
b=t;
}
void main()
{
int x=2,y=3; //x y 为实参
swap(x,y); //
函数调用完成后,a,b同时也结束生存周期
printf("a=%d,b=%d\n",x,y); //打印出的x y还是2和3,并没有改变
}
执行这个程序:
[root@wusi pluse]# ./c2
a=2,b=3
执行这个函数后,x,y并没有像预期的进行交换。原因如下:
执行swap(x,y)时,swap(int a, int b)形参a,b获得了x,y的拷贝。在swap函数中,a,b确实交换了。但a,b获取的是x,y的拷贝,x,y实质上并没有改变。函数调用完成后,a,b同时也结束生存周期。
有没有办法改变调用函数中的变量呢?
这就有了传址调用的概念。传址调用实质上也是一种传值调用。只不过这个值很特殊,是地址值。是把实参的地址传给形参,运算中是对实参进行操作,会改变实参的值
#include
void swap(int* a,int* b) //定义a b为指针变量 形参为地址
{
int t;
t=*a; //t 赋值指针变量a所保存的值
*a=*b; //*a 和*b所保存的值互换
*b=t; // *b赋值t的值
}
void main()
{
int x=2,y=3; //实参
swap(&x,&y); // 取x y的地址。
printf("a=%d,b=%d\n",x,y);
}
执行这个程序
[root@wusi pluse]# ./c2
a=3,b=2
这时,就实现了交换的功能。原因如下:
执行swap(x,y)时,swap(int a, int b)形参*a,*b获得了x,y的值。
在swap函数中,*a和*b内所存储的的值被改变。也就实现了x,y的互换。
传址调用对就是对实参的的值进行改变后到形参,传值就是对实参进行拷贝到形参。
常量与指针
const 把一个变量声明转换成常量声明,创建数组常量,指针常量以及指向常量的指针
如果变量声明中带有关键字const,则不能通过赋值,增量或减量运算来修改该变量的值,
在指针中:
const int *p; //p可变,p指向的内容不可变
int const *p; //p可变,p指向的内容不可变
int *const p; //p不可变,p指向的内容可变
const int * const p; //p和p指向的内容都不可变
当const出现在*号左边时指针的数据为常量
当const出现在*号右边时指针本身为常量
阅读(1168) | 评论(0) | 转发(0) |