网站首页 > 技术教程 正文
指针可以指向数组,有了指针,数组的引用就更加灵活了。
1 数组元素的4种表示方法
利用指针变量可以访问一片连续的存储区,只要将一个数组的首地址(数组名就代表首地址)赋给一个同类型的指针,这个指针就指向了这个数组,如下图:
int a[10];
pa = a; //数组名代表首地址
pa=&a[10]; //将第一个元素的首地址赋给指针pa
后两句中任一条语句都可以使指针pa指向数组a,有了这个指向,这片数据就有了更多的访问形式。数组元素的下标引用与指针引用两者的对应关系如下表:
下标表示法 | 指针表示法 | 数组名表示法 | 指针的下标表示法 |
a[0] | *pa | *a | pa[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] | pa | a | |
&a[1] | pa+1 | a+1 | |
&a[2] | pa+2 | a+2 | |
… | … | … | |
&a[9] | pa+9 | a+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把指针叫“引用”)。(数组名在一般高级语言中定义的是数组元素的首地址,是一个常量,其本身也主要是利用内存地址逻辑上的连续性或规律性。)
猜你喜欢
- 2024-10-04 C++核心准则编译边学-F.43 永远不要返回局部对象的指针或引用
- 2024-10-04 C++|虚函数多态机制的虚函数表及其指针的内存布局及手动引用
- 2024-10-04 C|指针分类与void指针的赋值、解引用与算术运算
- 2024-10-04 第5课,引用方式(锁定) 锁定引用值
- 2024-10-04 C++函数参数采用变量、引用和指针的区别
- 2024-10-04 Java String 手工引用指针 java中指针和引用
- 2024-10-04 C++核心准则C.145:通过指针或引用访问多态对象
- 2024-10-04 C\C++语言11|引用做为函数参数与返回值及与指针的区别
- 2024-10-04 Excel中的引用方式,看过之后你就懂
- 2024-10-04 C++,常量及sizeof函数,传值调用、指针调用和引用调用的区别
你 发表评论:
欢迎- 05-05从virsh当中学习QEMU/KVM启动命令
- 05-05Win10 BCD文件损坏怎么修复?(bcd文件损坏win7)
- 05-05亚马逊春节假期期间的店铺管理设置
- 05-051分钟总结常用k8s常用诊断教程(k8s常见故障)
- 05-05VisiPics重复图片查找软件中文汉化教程
- 05-05微服务的发布实现方式1灰度实现(微服务实现原理)
- 05-05轻松掌握Java多线程 - 第二章:线程的生命周期
- 05-05德拉诺之王邪DK报告:PVE向小测试及分析
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)