分享免费的编程资源和教程

网站首页 > 技术教程 正文

C++|指针强大功能:灵活引用数组 c++指针用法举例

goqiw 2024-10-04 22:06:56 技术教程 23 ℃ 0 评论

指针可以指向数组,有了指针,数组的引用就更加灵活了。

1 数组元素的4种表示方法

利用指针变量可以访问一片连续的存储区,只要将一个数组的首地址(数组名就代表首地址)赋给一个同类型的指针,这个指针就指向了这个数组,如下图:

int a[10];

pa = a; //数组名代表首地址

pa=&a[10]; //将第一个元素的首地址赋给指针pa

后两句中任一条语句都可以使指针pa指向数组a,有了这个指向,这片数据就有了更多的访问形式。数组元素的下标引用与指针引用两者的对应关系如下表:

下标表示法指针表示法数组名表示法指针的下标表示法
a[0]*pa*apa[0]
a[1]*(pa+1)*(a+1)pa[1]
a[2]*(pa+2)*(a+2)pa[2]
a[9]*(pa+9)*(a+9)pa[9]

数组元素地址的对应关系如下表:

数组元素的地址指针表示数组地址数组名表示数组地址
&a[0]paa
&a[1]pa+1a+1
&a[2]pa+2a+2

&a[9]pa+9a+9

说明:虽然数组的首地址a和指向数组的指针pa都是地址,从上面两个表中看,似乎一样,但其实不同,a是数组名,是个常量;pa是个变量,当指针上下移动时,只能用后者,即a++是非法的,pa++是合法的。

2 数组作函数参数

利用数组作函数的参数,“互传”大指数据进行处理,将数组、函数和指针综合在一起,使程序的处理能力大大增加。

2.1 数组做形参,数组指针做实参,实现数组排序

#include "stdafx.h"

#include <iostream.h>

void sort(int x[], int n);

void main()

{

int *p,i,a[10];

p=a;

for(i=0;i<10;i++)

cin>>*p++;

p=a;

sort(p,10);

for(p=a,i=0;i<10;i++)

{

cout<<*p<<" ";

p++;

}

cout<<"\n";

}

void sort(int x[], int n)

{

int i,j,t;

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++)

if(x[i]>x[j])

{

t=x[i];

x[i]=x[j];

x[j]=t;

}

}

代码分析:

1 排序函数有两个形参:一个数组x[],因为只是个形式,不知道数组的长度,就要用另一个形参int n告诉函数数组的长度。这是数组作形参的经典做法。

2 上面的主函数的输入、调用子函数、输出,全用指针p实现数据的访问,这时要特别关注指针的当前指向。三次p=a;都是为了将指针拉回正确的位置,再进行下一次操作。比如第二次p=a;,由于其前输入循环时,指针p已经下移,所以排序前必须再次让其指向数组的首地址。

2.2 数组指针做形参、实参,实现一组数中查找最大值、最小值

#include "stdafx.h"

#include <iostream.h>

void maxmin(int *,int,int *,int *);

void main()

{

int max,min,a[10]={6,-4,3,2,1,9,-9,6,-7,5},*p=a;

int *pmax=&max, *pmin=&min;

maxmin(p,10,pmax,pmin);

cout<<"max="<<max<<endl;

cout<<"min="<<min<<endl;

}

void maxmin(int *pa,int len,int *pmax,int *pmin)

{

int i;

*pmax=*pa;

*pmin=*pa;

pa++;

for(i=1;i<len;i++)

{

if(*pmax<*pa) *pmax=*pa;

if(*pmin>*pa) *pmin=*pa;

pa++;

}

}

//运行结果:max=9 min=-9

3 指向字符串的指针

在C语言中,字符串可以用字符数组表示,也可以用指针指向字符串,而且比用字符数组更为方便灵活。

char string[] = "I am a learner of self-taught";

char *pointer="I am a learner of self-taught";

pointer是指向字符串的指针,即字符串的首地址赋给了字符指针pointer。也可以采用下面的赋值方式:

char *pointer;

pointer ="I am a learner of self-taught";

任务:编写一个字符串拷贝函数(字符指针为参数)

#include "stdafx.h"

#include <iostream.h>

void my_strcpy(char *t,char *s);

void main()

{

char s1[33];

my_strcpy(s1,"I am a learner of self-teach");

cout<<s1<<endl;

}

void my_strcpy(char *t,char *s)

{

while((*t=*s)!='\0')

{

s++;

t++;

}

}

//运行结果:I am a learner of self-teach

字符数组与字符指针变量比较


字符数组字符指针变量
存储内容不同存放的是字符串本身,每个数组元素存放着一个字符;字符串的首地址
赋值方式不同字符数组只能对各个元素赋值,不能整体赋值;可以整体赋值
值是否可以改变?字符数组名代表着字符数组的首地址,是一个常量,不能改变可以改变

Java只能通过指针来操作数组和对象(Java把指针叫“引用”)。(数组名在一般高级语言中定义的是数组元素的首地址,是一个常量,其本身也主要是利用内存地址逻辑上的连续性或规律性。)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表