指针与数组形参在数值修改的特点

来源:互联网 发布:网站源码交易php源码 编辑:程序博客网 时间:2024/05/29 17:51

指针的概念:指针用于指向对象,定义方法DataType *elem,可以用对变量取地址操作符“&”来初始化指针,例如:elem=&var1,在指针上加一个整型数值,其结果仍然是指针。

指针操作变量的方法:指针通过解引用操作符(“*”)获取指针指向的对象,从而实现间接操纵其所指对象的功能。例如:

string s(“hello world”);

string *sp=&s;

*sp=”goodby”; //the value of s will be changed

cout<<*sp;

指针与数组:二者关系密切可以自动转换。例如:

int ia[]={0, 2, 4, 6, 8};

int *ip=ia; //等同于int *ip=&ia[0];

测试指向数组的指针与数组直接的关系;

1、  ip+i与数组&ia[i]之间的关系;(相等)

2、  *(ip+i)与数组ia[i]之间的关系;(相等)

3、  ip值修改对数组ia的影响;(无影响)

4、  ip做解引用后,修改*(ip+i)的值,对数组ia的影响。(相应做了修改)

测试指针与数组在函数中做形参时,形参在函数体中其值有修改,这种修改是否会导致调用体的传入变量有所修改。

可分成以下几种情况进行讨论:

1、  形参为指针,函数内修改其所代表的数组的值,将导致主函数变量的值发生变化,而形参为数组则不会导致修改;

#include <iostream>

void f1(char *s1, char [6] ar)

{

  s1[0]='o';

  s2[1]='k';

  ar[0]='a';

  ar[1]='r';

}

 

void main()

{

      char* s1=new char[6];

       s1[0]='h';

       s1[1]='e';

       s1[2]='l';

       s1[3]='l';

       s1[4]='o';

       s1[5]='/0';

       char ar[6];

       ar[0]='h';

       ar[1]='e';

       ar[2]='l';

       ar[3]='l';

       ar[4]='o';

       ar[5]='/0';

       std::cout<<"s1:"<<s1<<std::endl;

       std::cout<<"ar:"<<ar<<std::endl;

       f1(s1,ar);

       std::cout<<"s1:"<<s1<<std::endl;

       std::cout<<"ar:"<<ar<<std::endl;

       getchar();

       return 0;

}

输出结果:

s1:hello

ar:hello

s1:okllo

ar:hello

 

2、  想通过在函数体内实现指针的移动来实现主函数的指针指向对象发生变化是无效的,但是如果通过引用的话则可以;

#include <iostream>

void f2(char *s1)

{

       s1++;

}

 

void main()

{

char* s1=new char[6];

       s1[0]='h';

       s1[1]='e';

       s1[2]='l';

       s1[3]='l';

       s1[4]='o';

       s1[5]='/0';

       char *p1=s1;

    for (int i=0;i<6;i++)

       {

              std::cout<<"s1["<<i<<"]:"<<*p1<<std::endl;

              f2(p1);

              std::cout<<"s1["<<i<<"]:"<<*p1<<std::endl;

       }

       getchar();

       return 0;

}

 

输出:

s1[0]:h

s1[0]:h

s1[1]:h

s1[1]:h

s1[2]:h

s1[2]:h

s1[3]:h

s1[3]:h

s1[4]:h

s1[4]:h

s1[5]:h

s1[5]:h