Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108867
  • 博文数量: 35
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 287
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-01 19:56
文章分类
文章存档

2017年(6)

2016年(21)

2015年(8)

我的朋友

分类: 嵌入式

2015-12-26 19:50:29

变量:只是一段存储空间的别名

指针的本质:
*本质也只是一个变量
*需要占用一定的内存空间
*用于保存内存地址值

*的意义
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出现在*号右边时指针本身为常量









阅读(1142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~