[C学习]指针与数组

来源:互联网 发布:软件封装教程 编辑:程序博客网 时间:2024/04/30 17:15

变量的地址就是变量的指针,存放变量地址的变量就是指针变量.为了表示指针变量和它所指向的变量的关系,用"*"来表示指向.

----------------------------

1>指针的定义

基类型 *指针变量名;

如:int *p;

p:     是指针变量中存放的值,它是一个地址,指向另一个变量的地址.

*P:   是指向变量里存放的值.

&p:是指针变量本身的地址.

注:指针变量必须指定基类型,而一个指针变量只能指向同一个类型的变量.如只有整型变量的地址才或可以放到指向整型的指针中.

------------------------------

2>指针变量的引用

指针变量中只能存放地址,不能将其非地址类型的数据赋给一个指针变量.

*:指针运算符,(或是"间接运算符")

&:取地址运算符

a>运算符"&"只能作用于内存中体现地址的对象,即在内存中为该对象分配存储空间,如变量,数组元素.而&(x+3)和&5则是非法的.

b>取寄存器register变量的地址也是非法的,register变量没有存放在内存中,而是在CPU的寄存器中.没有内存地址.

c>单目运算符*将它的操作数当作为最终目标的地址来对待,并取这个地址里的内容.

----------------------------

指针的应用:

3>指针变量作为函数参数:作用是将一个变量的地址传递到另一个函数中

注意:运算符*和&与!,++,--相同,是自右向左结合.

*p++与(*P)++的比较:

  *P++:先作++,再取*,所以先取p的值(一个地址),取*,得这个地址的值,再对p进行++,即下移一 个单位.

  (*P)++:括号内的优先级最高,即先取p地址里的值,再将这个值++.p本身不变化.

举例说明:swap(,)几种情况-----交换值

a>最常见的值传递,形参不影响实参的.

swap(int    x,   int    y) { int temp;    temp=x;    x=y;    y=temp}//swap(10,20)还是10,20

swap(int  *x,  int  *y)  {int temp;  temp =*x; *x=*y;*y=temp}//变换,变成 20,10

swap(int  *x, int  *y)   {int *temp ; *temp=*x;*x=*y;*y=*temp}//变换,变成20,10,这个函数有问题,temp无确定的地址值,它的值是不可预见的,temp所指向的单元也是不可预见的,因此,对*temp赋值可能会破坏系统的正常工作.

swap(int  *x,int  *y)   { int * temp; temp=x;    x=y;     y=temp}//这个的值没有变化,但x,y指向地址变化

会画如上的内存变化过程.

注意:指针变量作函数参数,实参与形参之间数据传递也是单向的"值传递"方式.调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值.即在函数时不要出现地址交换,一般是对地址里的值进行修改.也可以用定义函数的形参为--指针常量,(即指针变量的值不能改变,一直指同一个地址,这个地址对应的值可变)

指针常量:指针本身是常量,但它指的内容可变.

如:char *const  name2 ="John";//name2指向字符串"John"首地址

        name2="abc";//错误,指针常量指向地址不能改变.

常量指针:这个地址里对应的内容不能改变,但可以改变指的对象.

如: const char * name1="John";//name1指向字符串"John"的首地址.

         *name1="1";//错误,想改变地址中的值,还有就是字符串的值可以用赋值符号来改变吗?

 

原创粉丝点击