指针在很多时候是与数组紧密相关的,因为数组元素的地址通常是连续的,这为指针的操作提供了方便。
1、数组元素的地址关系
一维数组的名字实际上就是指向这个数组的第一个元素的指针,也就是这个数组的起始地址。例如
int A[3]={1,2,3};
int p1=A;
int p2=&A[0];
A 既是数组的名字,也是整个数组 A 的起始地址,也就是第一个数组元素 A[0] 的存放地址。p1==p2
例:使用下标获取数组元素以及通过地址获取数组元素的区别与联系
// 使用下标获取数组元素以及通过地址获取数组元素的区别与联系
#include<iostream>;
using namespace std;
void main()
{
char words[10];
int i;
cout<<"please input the words"<<endl;
cin>>words; //只能输入9个字母,输入第10个再回车,会报错。'\0'结束符?
for(i=0;i<10;i++)
{
cout<<words[i]<<" "; //用下标的方法输出
}
cout<<endl;
for(i=0;i<10;i++)
{
cout<<*(words+i)<<" "; //用指针的方法输出
}
cout<<endl;
}
说明:
- words+i 是第 i+1 个元素存放的地址
- *(words+i) 表示的是第 i+1 个元素的地址所存放的数据值
- * words +i 是对地址 words 进行 * 运算,即取出 words[0] 的值,再加上 i
结果:
2、字符指针
char *pschar;
pschar="information string";
执行以上两行代码时,首先定义一个字符型指针变量,然后找出内存中存放常量字符串“information string” 的起始地址,并把这个地址赋值给指针变量 pschar。这个赋值是允许的,因为字符串常量“information string”本身是有自身的存储空间的,系统为它分配了19个字符的存储空间,并且系统在赋值时,已经将字符串常量转换成起始地址形式。
下面这种赋值是不被允许的:
char *pschar;
pschar='a';
例:将一个字符串常量 information 复制到字符数组中,并输出这个字符数组
// 将一个字符串常量 information 复制到字符数组中,并输出这个字符数组
#include<iostream>;
#include<string.h>;
using namespace std;
void main()
{
char *pchar, Chars[13];
pchar="information";
cout<<strlen(pchar)<<endl;
int i=0;
while(*pchar!='\0')
{
cout<<i<<endl;
Chars[i]=*pchar;
pchar++;
i++;
}
cout<<Chars<<endl;
cout<<Chars[11]<<endl;
cout<<(Chars[11]=='\0')<<endl;
cout<<strlen(Chars)<<endl;
for(pchar=Chars;*pchar!='\0';pchar++)
{
cout<<*pchar<<" "; //用指针的方法输出
}
cout<<endl;
}
结果:
结果分析:
在上面程序中,将information 复制的字符数组 Chars 中时,没有加结束字符‘\0’,所以后面出现乱码且长度不是定义的字符数组的长度。
修改后的程序代码为:
#include<iostream>;
#include<string.h>;
using namespace std;
void main()
{
char *pchar, Chars[13];
pchar="information";
cout<<strlen(pchar)<<endl;
int i=0;
while(*pchar!='\0')
{
cout<<i<<endl;
Chars[i]=*pchar;
pchar++;
i++;
}
Chars[i++]='\0';
cout<<Chars<<endl;
cout<<Chars[11]<<endl;
cout<<(Chars[11]=='\0')<<endl;
cout<<strlen(Chars)<<endl;
for(pchar=Chars;*pchar!='\0';pchar++)
{
cout<<*pchar<<" "; //用指针的方法输出
}
cout<<endl;
}
结果: