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

指针的概念:指针用于指向对象,定义方法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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值