指针与数组
- 1、指针与数组的关系
设有数组a,指向a的指针变量为pa,则有以下关系:pa+i,a+i,&a[i]指向i号元素a[i]。pa是变量,而a,a[i]是常量,应予以注意。
- 2、指向数组的指针
数组指针变量说明的一般形式为:
类型说明符 *指针变量名
例1:scanf使用数组名,用数组名或指针访问数组。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[5],i,*pa=a;//定义整型数组和指针,*pa=a可以在下一行为pa=a
for(i=0;i<5;i++)
scanf("%d",a+i);//可写成pa+i和&a[i]
for(i=0;i<5;i++)
printf("a[%d]=%d\n",i,*(a+i));//指针访问数组,可写成*(pa+i)或pa[i]或a[i]
return 0;
}
输入:1 2 3 4 5
输出:a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
说明:
①a+i是指向数组的第i个元素的指针。
②指针变量pa可以变,数组a不可以变。例如p=p+2;合法,a=a+2;非法。
③对于数组,可以直接用数组名当指针。
- 3、指针也可以看成数组名
例2:动态数组,计算前缀和数组
#include<bits/stdc++.h>
using namespace std;
int n;
int *a;//定义指针变量a,后面直接当数组名使用
int main(){
scanf("%d",&n);
a=new int[n+1];//向操作系统申请了连续的n+1个int型的空间
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=2;i<=n;i++)
a[i]+=a[i-1];
for(int i=1;i<=n;i++)
printf("%d",a[i);
return 0;
}
输入:5
1 2 3 4 5
输出:1 3 6 10 15
说明:
动态数组的优点:可以确定小数据没问题的前提下,尽量满足大数据的需求。
指针与字符串
- 1、字符串的表示形式
①用字符数组存放一个字符串,然后输出该字符串。
int main(){
char str[]="I love China!";
printf("%s\n",str);
}
②用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符数组。用字符指针指向字符串中的字符。
int main(){
char *str="I love China!";
printf("%s\n",str);
}
- 2、字符串指针作函数参数
例3:输入一个长度最大为100的字符串,以字符数组的方式储存,再将字符串倒序储存,输出倒序储存后的字符串。(这里以字符指针为函数参数)
#include<bits/stdc++.h>
using namespace std;
void swapp(char &a,char &b){//交换两个字符的位置
chat t;
t=a;a=b;b=t;
}
void work(char *str){
int len=strlen(str);
for(int i=0;i<=len/2;i++)
swapp(str[i),sre[len-i-1]);
}
int main(){
char s[110];
char *str=s;
gets(s);
work(str);
printf("%s",s);
return 0;
}
输入:! anihC evol I
输出:I love China!
指针与函数
- 1、指针作为函数参数
我们可以编写以下一个函数,用于将两个整型变量的值交换.
void swap(int *x,int *y){
int t=*x;
*x=*y;
*y=t;
}
这时,我们在其他函数中可以使用这个函数;
int a=5,b=3;
swap(&a,&b);
printf("a=%d,b=%d",a,b);
输出:a=3,b=5
- 2、函数返回指针
返回指针值的函数的一般定义形式为:
类型名 *函数名(参数列表)
例如:
int *a(int x,int y)
- 3、函数指针和函数指针数组
例4:使用函数指针调用函数示例。
#include<bits/stdc++.h>
using namespace std;
int t(int a){
return a;
}
int main(){
cout<<t<<endl;//显示函数地址
int (*p)(int a);//定义函数指针变量p
p=t;//将函数t的地址赋给函数指针p
cout<<p(5)<<','<<(*p)(10)<<endl;//输出p(5)是C++的写法,(*p)(10)是兼容C,这是使用p来调节函数的两种方法。
return 0;
}
输出:
1
5,10
函数指针的基本操作有三个:
①声明函数指针
②获取函数的地址
③使用函数指针来调用函数
例5:使用typedef定义函数指针示例。
#include<bits/stdc++.h>
using namespace std;
int sum(int a,int b){
return a+b;
}
typedef int (*LP)(int ,int);//定义了一个函数指针变量类型LP
int main(){
LP p=sum;定义了一个LP类型的函数指针LP,并赋值为sum
cout<<p(2,5);//使用p来调用函数,实参为2和5,调用sum函数,输出返回值7
return 0;
}
输出:7
例6:使用函数指针数组,模拟菜单功能实现方法示例。
#include<bits/stdc++.h>
using namespace std;
void t1(){cout<<"test1";}
void t2(){cout<<"test2";}
void t3(){cout<<"test3";}
void t4(){cout<<"test4";}
void t5(){cout<<"test5";}
typedef void(*LP)();//定义了一个函数指针变量类型LP
int main(){
LP a[]={t1,t2,t3,t4,t5};//定义了一个LP类型的函数指针数组a,并初始化
int x;
cin>>x;
a[x]();//使用a[x]()来调用选择的函数
return 0;
}
输入:2
输出:test3
结构体指针
- 1、结构体指针的定义与使用
当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。
结构体指针变量定义的一般形式:
结构体名 *结构体指针变量名
struct student{
char name[20];
char sex;
float score;
}*p;
也可写成
struct student{
char name[20];
char sex;
float score;
};
student *p;
引用结构体指针变量指向的结构体变量的成员方式如下:
①指针名->成员名
②(*指针名).成员名
例如:(*p).score与p->score是等价的。
例7:结构体指针运用举例。
#include<bits/stdc++.h>
using namespace std;
struct student{
char name[20];
char sex;
int score;
}s[3]={{"xiaoming",'f,'356},
{"xiaoliang",'f',350},
{"xiaohong",'m',0}};
int main(){
student *p;
printf("Name Sex Score\n");
for(p=s;p<s+3;p++)
printf("%-9s%3c%7d\n",p->sex,p->score);
return 0;
}
输出:
Name Sex Score
xiaoming f 356
xiaoliang f 350
xiaohong m 0
说明:
这里p++起到移动指针的作用,随着p的变化,输出数组不同元素内容。
- 2、自引用结构
struct stu{
char name[20];
int age,score;
stu *p;
};
下面的定义可以在实际操作中建立起一个链表。
struct node{
int x,y;
node *next;
}point;
也可写成
struct student{
char name[20];
char sex;
float score;
};这个分号不太对
student *p;
nb
%%%
(๑•̀ㅂ•́)و✧!