文章目录
第18节 指针与数组
1.一维数组与指针
►C++程序员更偏爱使用指针来访问数组元素,这样做的好处是运行效率高、写法简洁。
►1. 一维数组的地址
► 数组由若干个元素组成,每个元素都有相应的地址,通过取地址运算(&)可以得到每个元素的地址。
int a[10];
int *p=&a[0]; //定义指向一维数组元素的指针
p=&a[5]; //指向a[5]
►C++规定,数组名既代表数组本身,又代表整个数组的地址,还是数组首元素的地址值,即a与第0个元素的地
址&a[0]相同。例如下面两个语句是是等价的。
①p=a;
②p=&a[0];
►数组名是一个指针常量,因而它不能出现在左值和某些算术运算中,例如:
int a[10], b[10], c[10];
a=b; //错误,a是常量不能出现在左值的位置
c=a+b; //错误,a、b是地址值,不允许加法运算
a++; //错误,a是常量不能使用++运算
►2. 指向一维数组的指针变量
► 定义指向一维数组元素的指针变量时,指向类型应该与数组元素类型一致,例如:
int a[10], *p1;
double f[10], *p2;
p1=a; //正确
p2=f; //正确
p1=f; //错误,指向类型不同不能赋值
►3. 通过指针访问一维数组
► 由于数组元素的地址是规律性增加的,根据指针算术运算规则,可以利用指针及其运算来访问数组元素。
►设有如下定义:
int *p, a[10]={1,2,3,4,5,6,7,8,9,10};
p=a; //p指向数组a
p++;
设:a是一维数组名,p是指针变量且p=a。根据以上叙述,访问一个数组元素a[i],可以用:
①数组下标法:a[i];
②指针下标法:p[i];
③地址引用法:*(a+i);
④指针引用法:*(p+i)。
【例6.1】用多种方法遍历一维数组元素
①下标法。
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int a[10], i;
6 for (i=0;i<10;i++) cin>>a[i];
7 for (i=0;i<10;i++) cout<<a[i]<<" ";
8 return 0;
9 }
*****************************************
②通过地址间接访问数组元素。
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int a[10], i;
6 for (i=0;i<10;i++) cin>>*(a+i);
7 for (i=0;i<10;i++) cout<<*(a+i)<<" ";
8 return 0;
9 }
*****************************************
③通过指向数组的指针变量间接访问元素。
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int a[10], *p;
6 for (p=a;p<a+10;p++) cin>>*p;
7 for (p=a;p<a+10;p++) cout<<*p<<" ";
8 return 0;
9 }
►4.数组元素访问方法的比较
►(1)使用下标法访问数组元素,程序写法比较直观,能直接知道访问的是第几个元素。
►(2)而使用指针引用法,指针变量直接指向元素,不必每次都重新计算地址,能提高运行效率。
►(3)将自增和自减运算用于指针变量十分有效,可以使指针变量自动向前或向后指向数组的下一个或前一个元素。
2.指针与字符串
►可以利用一个字符型的指针处理字符串,其过程与通过指针访问数组元素相同。使用指针可以简化字符串的处理,是程
序员处理字符串常用的编程方法。
►C++允许定义一个字符指针,初始化时指向一个字符串常量,一般形式为:
char *p="C Language";
char *p;
p="C Language";
►初始化时,p存储了这个字符串首字符地址4000,而不是字符串常量本身,称p指向字符串。
►通过字符指针可以访问字符串。例如:
char str[]="C Language", *p=str; //p指向字符串的指针
cout<<p<<endl; //输出:C Language
cout<<p+2<<endl; //输出:Language
cout<<&str[7]<<endl; //输出:age
►通过字符指针遍历字符串。
char str[]="C Language", *p=str; //p指向字符串的指针
while (*p!='\0') cout<<*p++;
【例18.2】指针访问字符串举例
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 char str[100],*p=str;
6 cin>>str; //输入字符串
7 while (*p) p++; //指针p指向到字符串结束符
8 cout<<"strlen="<<p-str<<endl;
9 return 0;
10 }
/*
运行结果: JavaScript ↙
strlen=10
*/
►请记住,指针可以指向数组,使得数组的访问多了一种途径,但指针并不能替代数组来存储大批量数据。
char s[100]="Computer";
char *p="Computer";
►①存储内容不同
►②运算方式不同
►③赋值操作不同
►如果字符串数组是一个二维字符数组,例如:
char sa[6][7]={"C++","Java","C","PHP", "CSharp","Basic"};
►则字符串数组的内存形式为:
标签:10,int,18,元素,数组,字符串,指针
From: https://blog.csdn.net/m0_69088645/article/details/140218754